150 votes

Django FileField avec upload_to déterminé à l'exécution

Je suis en train de configurer mon télécharge de sorte que si l'utilisateur joe télécharge un fichier, il va à MEDIA_ROOT/joe plutôt que d'avoir tous les fichiers d'aller à MEDIA_ROOT. Le problème est que je ne sais pas comment définir ce dans le modèle. Voici comment il n'y paraît actuellement:

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

Donc est ce que je veux au lieu de '.' comme le upload_to, ont-il le nom de l'utilisateur.

Je comprends qu'en tant que de Django 1.0 vous pouvez définir votre propre fonction pour gérer le upload_to mais cette fonction n'a aucune idée de l'identité de l'utilisateur seront donc je suis un peu perdu.

Merci pour l'aide!

282voto

SmileyChris Points 5405

Vous avez probablement lu la documentation , alors voici un exemple simple pour vous aider:

 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)
 

Comme vous pouvez le voir, vous n'avez même pas besoin d'utiliser le nom de fichier indiqué - vous pouvez remplacer celui que vous avez appelé dans votre upload_to si vous le souhaitez.

13voto

gdakram Points 101

Cela a vraiment aidé. Pour un peu plus de concision, j'ai décidé d'utiliser lambda dans mon cas:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X