2010-03-07 4 views
1

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. 

Répondre

1

J'imagine que votre problème vient d'essayer de remplir l'attribut utilisateur de votre modèle avec un nom d'utilisateur. Si le formulaire de téléchargement sera toujours utilisé par un utilisateur connecté, vous pouvez utiliser ceci:

dummy = trimrcUpload(user=request.user) 

Sinon, si vous voulez encore passer le nom d'utilisateur comme vous le faites maintenant, vous pouvez essayer quelque chose comme:

try: 
    user = User.objects.get(username=username) 
    dummy = trimrcUpload(user=user) 
except User.DoesNotExist: 
    # Probably have to set some kind of form error 

Je recommanderais d'aller avec la première option qui vous permettrait de ne pas avoir à passer le nom d'utilisateur à la vue.

+0

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

0

Le code original de la question fonctionne réellement.

Questions connexes