2011-11-18 13 views
15

Estoy tratando de crear un campo en un modelo, que debe almacenar una imagen para un usuario registrado. Esta imagen debe renombrarse y almacenarse en un directorio de usuario separado como media/users/10/photo.jpeg.Imagen de usuario de la tienda Django en el modelo

He buscado mucho, pero todavía no puedo encontrar cómo hacerlo de forma limpia y correcta. Me parece que muchos sitios requieren la misma funcionalidad y esto debería estar en django docs, pero no es así.

+0

Usted están creando un directorio para cada identificación de usuario? ¿Por qué no 'media/users/10.jpeg'? Simplemente preguntando: D –

+0

Porque podría haber otro contenido relacionado con el usuario para almacenar :) – dragoon

+0

¡Oh, ya veo! Creo que me he enfrentado a un problema similar, déjame ver si puedo ayudar –

Respuesta

35

que desea usar la opción "upload_to" en una ImageField

#models.py 
import os 

def get_image_path(instance, filename): 
    return os.path.join('photos', str(instance.id), filename) 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    profile_image = ImageField(upload_to=get_image_path, blank=True, null=True) 

Este es el código directamente de un proyecto mío. La imagen cargada va a /MEDIA_ROOT/photos/<user_id>/filename

Por lo desea, basta con cambiar la cadena 'fotos' a 'usuarios' en def get_image_path

Aquí está el pequeño fragmento de ello en los documentos, bajo FileField detalles

+0

Cool , esto realmente guarda el archivo en la ubicación correcta, pero cuando lo uso en la plantilla '' {{user.profile_image}} '' por alguna razón da ''/users/users/40/photo.png'' en lugar de ' '/ media/users/40/photo.png'' – dragoon

+1

Lo siento, debería haber usado' '{{user.profile_image.url}}' ' – dragoon

+3

models.ForeignKey (User, unique = True) debe ser models.OneToOneField (Usuario) – vinyll

0

Tendrá que hacer un modelo que tenga una clave externa para el modelo de Usuario, donde puede tener un image field para el Usuario. No recomendaría modificar el modelo de usuario en sí.

+2

Lo siento, pero la pregunta no es sobre el modelo, se trata de cómo almacenar imágenes. – dragoon

+1

Puede crear una ruta de carga dinámica para cualquier campo FileField o Image. Simplemente agregue una función a su modelo que devuelva la ruta para upload_to. Puede encontrar un ejemplo en los documentos de Django en: https://docs.djangoproject.com/en/1.3/ref/models/fields/#filefield – Brandon

+1

No es la mejor respuesta, pero no vale la pena un voto negativo ... – nicorellius

Cuestiones relacionadas