2009-10-15 4 views
5

En mi modelo PerfilUsuario me gustaría tener una función que devuelve ya sea una imagen predeterminada ImageFileField objeto del usuario o si el usuario no ha subido su propia cuenta.cree y devolver un ImageFieldFile predeterminado desde el interior de una función

Por ejemplo:

class UserProfile(models.Model): 
    pic = models.ImageField('Headshot',blank=True, 
          upload_to=get_path_and_filename) 

    def get_pic(self): 
     if self.pic: 
      return self.pic 
     else: 
      # return ImageFileField with a default value 

quiero devolver un equivalente ImageFileField porque tengo filtros que trabajan con este tipo de objeto (por lo que no sólo puede pasar una cadena, fácilmente) ... Probé mirando el source code pero no puedo entender cómo hacerlo yo mismo.

¿Hay una manera fácil de inicializar un nuevo objeto ImageFileField pasándole una ruta a un archivo de imagen y luego devolverlo?

PS: que había pensado en utilizar una configuración por defecto para la ImageField, sin embargo, parece menos flexible debido a que el archivo se almacena en la creación del modelo ... y si más adelante desea cambiar el archivo predeterminado, Tendría que actualizar todas las entradas de la base de datos que tenían el archivo anterior.

Respuesta

11

Probablemente fue un error tipográfico, pero lo que realmente desea devolver es un ImageFieldFile.

El ImageField hace que la propiedad de la instancia modelo en realidad sea aa ImageFileDescriptor. Cuando accede a la propiedad, devuelve una instancia de ImageFieldFile.

Mientras no se llama a los save() o delete() métodos de la ImageFieldFile, puede instanciar una forma razonablemente fácil:

from django.db.models.fields.files import ImageFieldFile, FileField 

class UserProfile(models.Model): 
    # ... 

    def get_pic(self): 
     if self.pic: 
      return self.pic 
     return ImageFieldFile(instance=None, field=FileField(), 
           name='pictures/default.jpg') 
+0

Tienes razón, eso fue un error de mi parte disléxicos (consistente, aunque , Podría agregar). Solo voy a usar la función 'get_pic' en mis plantillas ... espero que esto no sea demasiado" inseguro ". Voy a probar esto mañana. Parece que hará lo que yo quiero. No me di cuenta de que los campos individuales podrían ser 'save()' o 'delete()' ... ¡aprende algo todos los días! Gracias. – thornomad

+0

Parece que debería funcionar, pero me aparece un error: Archivo "/usr/lib/python2.5/site-packages/django/db/models/fields/files.py", línea 23, en __init__ self.storage = field.storage AttributeError: el objeto 'NoneType' no tiene atributo 'storage' Si cambio esto a 'field = self.pic', entonces funciona bien; Intenté pasarle un objeto vacío de ImageField pero eso no funcionó. No estoy seguro de si esto es bueno, pero está funcionando. – thornomad

+1

Oh, eso es correcto. Mentí, no puedes usar un ImageFieldFile así como así. Editando mi respuesta ... – SmileyChris

Cuestiones relacionadas