2009-02-03 34 views
10

He estado intentando help(django.db.models.ImageField) y dir(django.db.models.ImageField), buscando cómo se podría crear un objeto ImageField a partir de una imagen que se carga.Django: ¿cómo se convierte InMemoryUploadedFile en FieldFile de ImageField?

request.FILES tiene las imágenes como InMemoryUploadedFile, pero estoy tratando de salvar a un modelo que contiene un ImageField, por lo que ¿Cómo se activa el InMemoryUploadedFile en el ImageField?

¿Cómo se puede encontrar este tipo de cosa? Sospecho que las dos clases tienen una relación de herencia, pero tendría que hacer un montón de dir() -ing para averiguar si debía buscar.

Respuesta

3

¿Estás intentando hacerlo en ModelForm?

Esta es la forma en que lo hice para el campo de archivo

class UploadSongForm(forms.ModelForm): 
    class Meta: 
     model = Mp3File 

    def save(self): 
     content_type = self.cleaned_data['file'].content_type 
     filename = gen_md5() + ".mp3" 
     self.cleaned_data['file'] = SimpleUploadedFile(filename, self.cleaned_data['file'].read(), content_type) 
     return super(UploadSongForm, self).save() 

Se puede tomar como ejemplo y buscar en la fuente de las necesidades de la clase lo InMemoryUploadedFile en los parámetros de inicialización.

+0

Gracias, voy a echar un vistazo en su ejemplo más cercano mañana. Estoy pasando por alto el proceso de formularios, ya que estoy tratando de evitar que los usuarios carguen imágenes dos veces, por lo que no puedo hacer la tarea de limpiar_datos. –

1

Se podría implementar un formulario con un campo de carga de archivos mediante el uso de casos de forma, aquí es la vista:

def form_view(request): 
    if request.method == 'POST': 
     form = FooForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return render_to_response('result.html') 
     return render_to_response('form.html', { 
      'form': form; 
      'error_messages': form.errors; 
     } 
    form = FooForm() 
    return render_to_response('form.html', { 
     'form': form; 
    } 

form.save() guarda el archivo subido junto con todos los otros campos como usted incluido request.FILES argumento en su constructor. En sus modelos tiene que definir FooForm subclase de ModelForm clase como esta:

class FooForm(ModleForm): 
    Meta: 
     model = Foo 

... donde foo es la subclase de modelo, que describe los datos que desea almacenar persistentemente.

16

Tendrá que guardar la InMemoryUploadedFile a la ImageField en lugar de '' girando en un ImageField:

image = request.FILES['img'] 
foo.imagefield.save(image.name, image) 

donde foo es la instancia de modelo, y ImageField es la ImageField.

Alternativamente, si usted está tirando de la imagen de un formulario:

image = form.cleaned_data.get('img') 
foo.imagefield.save(image.name, image) 
+0

Esta respuesta no es correcta. Puede usar el contenido del archivo como desee sin guardarlo en una instancia modelo. Inspeccione el atributo de archivo – Imnl

Cuestiones relacionadas