L'objectif est de mettre à jour dynamiquement upload_to de sorte que les fichiers téléchargés par l'utilisateur soient stockés dans un répertoire qui dépend de l'utilisateur. Il y a plusieurs exemples de ceci en ligne, mais aucun utilisant ModelForm. Voir les extraits de code pour les deux problèmes, l'un est que je reçois une chaîne vide pour la valeur instance.user, et quand j'essaie de résoudre ce problème, le formulaire n'est pas valide.Django: Comment utiliser upload_to = fonction avec ModelForm
# models.py
def get_file_path(instance, filename):
# make the filepath include the signed in username
print "inst: %s" % instance.__dict__.keys()
print "inst:user:%s" % instance.user # <-- This is empty string!!
print "file: %s" % filename
return "%s/myapp/%s/%s" % (settings.MEDIA_ROOT, instance.user, filename)
class trimrcUpload(models.Model):
user = models.CharField(max_length = 20)
inputFile = models.FileField(upload_to = get_file_path)
# forms. py
class trimrcUploadForm(ModelForm):
class Meta:
model = trimrcUpload
exclude = ('resultFile', 'numTimesProcessed')
# views.py
def myapp_upload(request, username, template_name="myapp/myapptemplate.html"):
dummy = trimrcUpload(user=username)
if request.POST:
form = trimrcUploadForm(request.POST, request.FILES, instance=dummy)
if form.is_valid():
success = form.save()
success.save()
# form is not valid, user is field is "required"
# the user field is not displayed in the template by design,
# it is to be populated by the view (above).
# http://docs.djangoproject.com/en/1.0/topics/forms/modelforms/
# about halfway down there is a "Note" section describing the use of dummy.
Mais le nom d'utilisateur est une chaîne valide. OMG. Je ne sais pas pourquoi, mais ça fonctionne complètement maintenant. Je ferais mieux de signaler cette réponse. – mgag