2010-10-07 9 views
4

J'essaie finalement de valider un FileField par type d'extension. Mais j'ai du mal à obtenir la méthode clean pour ce champ pour récupérer la valeur POSTed.Valider/nettoyer un FileField sur un formulaire non-modèle dans Django?

from django.forms.forms import Form 
from django.forms.fields import FileField 
from django.forms.util import ValidationError 

class TestForm(Form):   
    file = FileField(required=False) 

    def clean_file(self): 
     value = self.cleaned_data["file"] 
     print "clean_file value: %s" % value 
     return None  

@localhost 
def test_forms(request): 
    form = TestForm()  
    if request.method == "POST": 
     form = TestForm(request.POST)   
     if form.is_valid(): 
      print "form is valid" 
    return render_to_response("test/form.html", RequestContext(request, locals())) 

Quand je lance le code, je reçois la sortie suivante:

clean_file value: None 
form is valid 

En d'autres termes, la méthode clean_file n'est pas en mesure d'obtenir les données du fichier. De même, s'il renvoie None, le formulaire est toujours valide.

Voici ma forme html:

<form enctype="multipart/form-data" method="post" action="#"> 
    <input type="file" id="id_file" name="file"> 
    <input type="submit" value="Save"> 
</form> 

J'ai vu couple snippets avec solutions pour ce problème, mais je ne peux pas les amener à travailler avec une forme non-modèle. Ils déclarent tous deux un type de champ personnalisé. Quand je fais cela, j'ai le même problème; L'appel de super() renvoie un objet None.

+0

FYI - Je vois l'objet InMemoryUploadFile dans request.FILES. –

Répondre

4

Vous ne transmettez pas request.FILES dans le formulaire lorsque vous l'instanciez dans le message.

form = TestForm(request.POST, request.FILES) 

Voir the documentation. Notez également que vous instanciez le formulaire deux fois sur POST, ce qui est inutile. Déplacez le premier dans une autre clause à la fin de la fonction (au même niveau que if request.method == 'POST').