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?

On dirait que votre formulaire html est manquant le nom des attributs dans votre champs de saisie, essayez comme <input type="file" id="grade_csv" name="fichier"/>
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