2011-08-31 10 views
5

He examinado las preguntas relacionadas, pero ninguna de las respuestas parece funcionar. Estoy tratando de cargar una imagen de perfil para un usuario y hacer que reemplace (sobrescribir) la imagen actual. Al guardar la imagen, quiero cambiar el nombre del archivo a la identificación del usuario. En su forma actual, la imagen se cargará, pero no reemplazará la imagen existente (por ejemplo, se guardará como 2_1.png).Carga de la imagen de perfil 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}) 

Respuesta

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() 

cheque aquí: https://docs.djangoproject.com/en/dev/topics/http/file-uploads/ Si eso no funciona, supongo que sólo podría utilizar os.system para eliminar el archivo si se acepta el formulario. Probablemente esa no sea una gran solución, pero debería funcionar.

+0

Gracias. Esa es una respuesta que encontré, pero quería que el ModelForm manejara el guardado. Terminé subclasificando FileSystemStorage para sobrescribir una imagen existente y usando el nuevo almacenamiento en el campo de imagen bajo el Modelo de perfil de usuario. – dvw

+0

Oh, está bien. ¡Es genial escuchar que lo hiciste funcionar! – randrumree

+0

Tu código tiene un pequeño error tipográfico. dest.write (fragmento) –

Cuestiones relacionadas