demande.FICHIERS toujours vide sur un téléchargement de fichier
Je suis totalement perplexe sur ce point, et doit être en train de faire quelque chose d'incroyablement stupide. Je suis en train de simplement télécharger un fichier sur un projet Django. Le problème semble être que PAS de formulaire, les données sont transmises via le serveur--seul le jeton csrf. Je suis en cours d'exécution Django 1.5.1, python 2.7, virtualenv, sur un Mac, et à l'aide de l'intégré dans le serveur de développement de Django.
Mon formulaire HTML est:
{% load url from future %}
<form enctype="multipart/form-data" method="POST" action="{% url 'showreport' %}">
{% csrf_token %}
<label>Upload grade csv file: </label>
<input type="hidden" id="testing" value="maybe" />
<input type="file" id="grade_csv" />
<input type="submit" value="Generate Report" />
</form>
Mon modèle:
from django.db import models
class Document(models.Model):
file = models.FileField(upload_to='/media/', blank=True, null=True)
Mon forms.py:
from django import forms
from .models import Document
class DocumentForm(forms.Form):
"""
to handle uploading grades csv file
"""
class Meta:
models = Document
Mon views.py:
def report(request):
"""
Process the CSV file to remove inactive students
Manipulate to get right JSON format
Chart the results
"""
if request.method == 'POST':
form = DocumentForm( request.POST, request.FILES )
if form.is_valid():
newfile = Document( file = request.FILES['file'] )
newfile.save()
classdata = {}
studentdata = {}
return render( request, 'report/showreport.html', { 'classdata': classdata, 'studentdata': studentdata } )
else:
form = UploadFileForm()
return render( request, 'report/index.html', { 'form': form })
J'ai passé plusieurs heures à chercher une solution, mais rien ne semble fonctionner. J'ai le enctype réglé correctement (Je pense), Je suis l'aide de l'entrée de type 'soumettre' pour la forme, et Je suis de liaison de données de la forme de mon modèle (n'a pas d'importance, puisque la demande.FICHIERS est vide). J'ai aussi essayé d'utiliser directement l'url dans mon form action (action='/rapport/showreport/') par ce Django débutant page, mais ce n'est pas faire une différence. Aussi loin que je peux dire, il n'y a pas d'autres scripts de liaison pour le formulaire de soumission de l'action et de la substitution de l'action par défaut.
Je me rends compte que le code ci-dessus devrait plus likley être demande.FILES['grades_csv'] pour correspondre à la forme de l'entrée d'id...mais qui aussi n'a pas d'importance pour l'instant, puisque la demande.FICHIERS est vide.
En essayant de debug, j'ai mis un apb trace juste avant la demande.méthode == "POST" de mon point de vue. À l'aide de la console, je peux voir que ma demande.Après ne comprennent pas mon cachés "test d'entrée", et que la demande.FICHIERS est vide. Lorsque je l'exécute dans un navigateur, il vient de me renvoie à ma page de formulaire, essentiellement de me dire que mon formulaire n'est pas valide. Mon apb résultats sont ici:
(Pdb) request.FILES
(Pdb) <MultiValueDict: {}>
(Pdb) request.POST['testing']
(Pdb) *** MultiValueDictKeyError: "Key 'testing' not found in <QueryDict: {u'csrfmiddlewaretoken': [u'0tGCChxa3Po619dCi114Sb9jmWRt82aj']}>"
(Pdb) request.POST
<QueryDict: {u'csrfmiddlewaretoken': [u'0tGCChxa3Po619dCi114Sb9jmWRt82aj']}>
Si j'essaie d'accéder à la demande.FICHIERS dans mon views.py sans vérifier si le formulaire est valide, j'obtiens cette erreur:
"Key 'file' not found in <MultiValueDict: {}>"
Je suis perplexe et apprécier l'aide sur pourquoi je ne peux pas obtenir que cela fonctionne--il semble que ce devrait être simple. Je peux créer manuellement et d'écrire des fichiers dans mon répertoire de projet à l'aide de l'apb, donc je ne pense pas que les autorisations sont le problème...le problème est dans la forme?
A peu de choses qui se méfient de moi. Vos entrées d'un formulaire sont manquants
name
attributs. Vous êtes sous-classement forms.Form
mais ont un Meta
classe en indiquant que vous souhaitez forms.ModelForm
. Si vous avez l'intention d'utiliser un modèle de formulaire, vous n'avez pas besoin d'instancier un objet de Document parce que la forme fait pour vous.Génie: merci! Je serais heureux d'accepter que la réponse si vous la présentez comme une...
C'est presque certainement le manque
name
attributs. C'est là que les clés de la POSTE viennent les données, pas les Identifiants.les attributs de nom fixe...pas sûr que je comprends tout à fait Scott commentaire sur le modèle des formulaires (j'essayais de suivre le Django exemple sur les formulaires). Est-ce à dire je n'ai pas besoin de la classe Meta: tag?
OriginalL'auteur user | 2013-07-17
Vous devez vous connecter pour publier un commentaire.
Vérifiez que vous avez ajouté
enctype
propriété dansform
tag.Exemple de officiel docs:
<form enctype="multipart/form-data" method="post" action="/foo/">
OriginalL'auteur Evgeney Kuznetsov
J'ai eu ce problème aussi, et a été déroutant pour un certain temps. Mon erreur a été la même, - que j'ai été absent champs nécessaires sur le
input
champ.Afin de voir ce que le fait que les champs requis sont, d'une très belle chose à faire est, dans ce cas:
Cela permettra d'imprimer le code html que vous avez besoin, y compris toutes les balises que cet objet exige. Très soigné fonctionnalités dont j'ai raté la première fois, mais ce qui est décrit dans les docs.
OriginalL'auteur gabe