2009-03-11 6 views
10

Je dois valider le contenu d'un fichier XML téléchargé dans ma méthode Form clean, mais je ne parviens pas à ouvrir le fichier pour validation. Il semble que, dans la méthode clean, le fichier n'a pas encore été déplacé de la mémoire (ou du répertoire temporaire) vers le répertoire de destination. Par exemple, le code suivant ne fonctionne pas car le fichier n'a pas encore été déplacé vers cette destination. Par exemple, le code suivant ne fonctionne pas. Il est encore en mémoire (ou le répertoire temporaire):Django: Ouvrir le fichier téléchargé alors qu'il est encore en mémoire; Dans la méthode Form Clean?

xml_file = cleaned_data.get('xml_file') 
xml_file_absolute = '%(1)s%(2)s' % {'1': settings.MEDIA_ROOT, '2': xml_file} 
xml_size = str(os.path.getsize(xml_file_absolute)) 

Quand je regarde la variable "cleaned_data" il montre ceci:

{'xml_file': <InMemoryUploadedFile: texting.nzb (application/octet-stream)>} 

cleaned_data.get('xml_file') ne retourne "texting.nzb" comme une chaîne.

Existe-t-il un autre moyen d'accéder au fichier en mémoire (ou au répertoire temporaire)?


Encore une fois, cela est dans ma méthode de formulaire clean qui est lié dans la vue de l'administration par défaut. On m'a dit à maintes reprises que toute validation devrait être traitée dans un formulaire, pas la vue. Correct?

Répondre

15

Je suppose que vous avez lié votre formulaire aux fichiers en utilisant:

my_form = MyFormClass(request.POST, request.FILES) 

Si vous avez, une fois le formulaire validé, vous pouvez accéder au contenu du fichier lui-même en utilisant les request.FILES dictionnaire:

if my_form.is_valid(): 
    data = request.FILES['myfile'].read() 

Les request.FILES [ 'myfile'] objet est un objet UploadedFile, il prend en charge les opérations de lecture/écriture de fichiers comme.

Si vous avez besoin d'accéder au contenu du fichier à partir de la méthode clean du formulaire (ou de toute autre méthode de nettoyage), vous le faites correctement. cleaned_data.get('xml_file') renvoie un objet UploadedFile. La méthode __str__ de cet objet imprime simplement la chaîne, c'est pourquoi vous ne voyez que le nom du fichier. Cependant, vous pouvez accéder à tout le contenu:

xml_file = myform.cleaned_data.get('xml_file') 
print xml_file.read() 

Cette section de la documentation a quelques grands exemples: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/

+0

Je n'ai pas écrit quoi que ce soit dans une vue. J'utilise la méthode "clean" dans mon formulaire pour effectuer la validation, puis je teste en utilisant la vue d'administration par défaut. Ne fait-on pas toute la validation dans le formulaire de la "manière Django"? –

+0

Peu importe où vous le faites. Vous devez accéder à request.FILES pour obtenir le fichier temporaire comme le montrent les documents. Vous pouvez le faire dans la classe Form si vous le souhaitez. –

+0

J'ai mis à jour ma réponse avec des instructions sur la façon d'obtenir l'objet fichier téléchargé à l'intérieur du formulaire lui-même puisque, dans votre cas, le formulaire.is_valid() a besoin du fichier. –

Questions connexes