2011-08-31 19 views
5

Ho dato un'occhiata a domande correlate, ma nessuna delle risposte sembra funzionare. Sto cercando di caricare un'immagine del profilo per un utente e farlo sostituire (sovrascrivere) l'immagine corrente. Al salvataggio dell'immagine voglio cambiare il nome del file nell'id utente. Nella sua forma attuale l'immagine verrà caricata, ma non sostituirà l'immagine esistente (ad esempio, verrà salvata come 2_1.png).Caricamento immagine profilo con Django ModelForm

class PhotoForm(forms.ModelForm): 
    def save(self): 
     content_type = self.cleaned_data['photo'].content_type.split('/')[-1] 
     filename = '%d.%s' % (self.instance.user.id, content_type) 

     instance = super(PhotoForm, self).save(commit=False) 
     instance.photo = SimpleUploadedFile(filename, self.cleaned_data['photo'].read(), content_type) 
     instance.save() 
     return instance 

    class Meta: 
     model = UserProfile 
     fields = ('photo',) 

def photo_form(request): 
    if request.method == 'POST': 
     form = PhotoForm(data=request.POST, file=request.FILES, instance=request.user.get_profile()) 
     if form.is_valid(): 
      form.save() 
    else: 
     form = PhotoForm() 
    return render(request, 'photo_form.html', {'form': form}) 

risposta

5
def photo_form(request): 
    if request.method == 'POST': 
     form = PhotoForm(data=request.POST, file=request.FILES, instance=request.user.get_profile()) 
     if form.is_valid(): 
      handle_uploaded_file(request.FILES['<name of the FileField in models.py>']) 

def handle_uploaded_file(f): 
    dest = open('/path/to/file', 'wb') # write should overwrite the file 
    for chunk in f.chunks(): 
     dest.write(chunk) 
    dest.close() 

controllo qui: https://docs.djangoproject.com/en/dev/topics/http/file-uploads/ Se questo non funziona, suppongo si potrebbe utilizzare os.system per eliminare il file se il modulo è accettato. Probabilmente non sarebbe la soluzione migliore, ma dovrebbe funzionare.

+0

Grazie. Questa è una risposta che ho trovato, ma volevo che ModelForm gestisse il salvataggio. Ho finito con la sottoclasse di FileSystemStorage per sovrascrivere un'immagine esistente e utilizzare la nuova memoria nel campo immagine sotto il Modello Profilo Utente. – dvw

+0

Oh okay. E 'fantastico sentirti al lavoro! – randrumree

+0

Il tuo codice ha un piccolo errore di battitura. dest.write (pezzo) –