upload_to type tutorial files example python django django-models

python - type - Django FileField con upload_to determinado en tiempo de ejecución



models filefield example (3)

Intento configurar mis cargas para que, si el usuario joe carga un archivo, va a MEDIA_ROOT / joe en lugar de hacer que todos los archivos vayan a MEDIA_ROOT. El problema es que no sé cómo definir esto en el modelo. Así es como se ve actualmente:

class Content(models.Model): name = models.CharField(max_length=200) user = models.ForeignKey(User) file = models.FileField(upload_to=''.'')

Entonces, lo que quiero es en lugar de ''.'' como upload_to, tiene que ser el nombre del usuario.

Entiendo que a partir de Django 1.0 puedes definir tu propia función para manejar el upload_to pero esa función tampoco tiene idea de quién será el usuario, así que estoy un poco perdido.

¡Gracias por la ayuda!


Esto realmente ayudó. Por un poco más de brevedad, decidí usar lambda en mi caso:

file = models.FileField( upload_to=lambda instance, filename: ''/''.join([''mymodel'', str(instance.pk), filename]), )


Probablemente hayas leído la documentación , así que aquí hay un ejemplo fácil para que tenga sentido:

def content_file_name(instance, filename): return ''/''.join([''content'', instance.user.username, filename]) class Content(models.Model): name = models.CharField(max_length=200) user = models.ForeignKey(User) file = models.FileField(upload_to=content_file_name)

Como puede ver, ni siquiera necesita usar el nombre de archivo dado; puede anularlo en su upload_to invocable también si lo desea.


Una nota sobre el uso del valor pk del objeto ''instancia''. De acuerdo con la documentación:

En la mayoría de los casos, este objeto no se habrá guardado aún en la base de datos, por lo que si usa el AutoField predeterminado, es posible que todavía no tenga un valor para su campo de clave principal.

Por lo tanto, la validez de usar pk depende de cómo se defina su modelo particular.