Django wirft MultiValueDictKeyError bei Datei-Upload
Habe ich bereits konsultiert vielen Foren und ich kann nicht eine Antwort bekommen. Ich habe installiert eine Datei hochladen, in meinem Django-app zum speichern von Daten in meinem server. Aber es funktioniert nicht. Stattdessen wirft er eine MultiValueDictKeyError. Ich denke das problem ist, dass es keine Anfrage.DATEIEN (weil es wirft einen Fehler im Antrag.DATEIEN erwähnt), so dass der Datei-upload nicht funktioniert. Dies ist mein views.py:
def list_files(request, phase_id):
phase = get_object_or_404(Phase, pk=int(phase_id))
if request.method == 'POST':
#form = DocumentForm(request.POST, request.FILES)
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
newdoc = Document(docfile = request.FILES['docfile'], phase = phase_id)
newdoc.save()
doc_to_save = request.FILES['docfile']
filename = doc_to_save._get_name()
fd = open(settings.MEDIA_URL+'documents/'+str(filename),'wb')
for chunk in doc_to_save.chunks():
fd.write(chunk)
fd.close()
return HttpResponseRedirect(reverse('list_files'))
else:
form = DocumentForm()
documents = Document.objects.filter(phase=phase_id)
return render_to_response('teams_test/list_files.html',{'documents': documents, 'form':form, 'phase':phase}, context_instance = RequestContext(request)
)
Dokument in form forms.py:
class DocumentForm(forms.ModelForm):
docfile = forms.FileField(label='Select a file', help_text='max. 42 megabytes')
class Meta:
model = Document
Die Klasse Dokument in models.py:
class Document(models.Model):
docfile = models.FileField(upload_to='documents')
phase = models.ForeignKey(Phase)
Endlich, mein html-code:
{% extends "layouts/app.html" %}
{% load i18n user %}
{% block title %}{% trans "Files list" %}{% endblock %}
{% block robots %}noindex,nofollow{% endblock %}
{% block page%}
<div id="page" class="container">
<div class="header prepend-2 span-20 append-2 last whiteboard">
<h2 style="margin-left:-40px">{{ phase.name }} files</h2>
{% if documents %}
<ul>
{% for document in documents %}
<li><a href="{{ document.docfile.url }}">{{ document.docfile.name }}
{% endfor %}
</ul>
{% else %}
<p>No documents.</p>
{% endif %}
<form action="{% url list_files phase.id %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input id="file" type="file" />
<input id="submit" type="submit" value="Upload file" />
</form>
</div>
</div>
{% endblock %}
Meine traceback sagt:
Exception Type: MultiValueDictKeyError
Exception Value: "Key 'docfile' not found in <MultiValueDict: {}>"
my_dir/views.py in list_files
newdoc = Document(docfile = request.FILES['docfile'], phase = phase_id)
Und meine QueryDict leer ist:
POST:<QueryDict: {u'csrfmiddlewaretoken': [u'UZSwiLaJ78PqSjwSlh3srGReICzTEWY1']}>
Warum? Was mache ich falsch?
Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie ändern
multipart/form_data
zumultipart/form-data
- das ist, warumrequest.FILES
leer ist: die form ist nicht das senden Dinge in den Weg, Django rechnet wegen der Tippfehler. [EDIT: dies ist nun geschehen]Update 1: Auch, anstatt direkt auf Anfrage.DATEIEN, versuchen, sich auf die modelform Standard-Verhalten, dann werde es behandelt worden, wie ein upload entsprechend. dh
newdoc = form.save()
tun sollten alles, was Sie brauchen, von einem schnellen Blick auf Sie - gibt es einen bestimmten Grund, Sie manuell speichern Sie die Datei, wenn die modelform kann das für Sie tun?Update 2: Ah, sehen Sie: Sie sind nicht die Zuordnung eines namens zu Datei-upload-element
Aus der docs:
So, Sie brauchen, um zu ändern
zu
oder für Standard-Django-Konvention
In der Tat, es ist in der Regel besser zu nutzen die Django-form zu Rendern, das eigentliche Feld, auch wenn Sie verschoben haben, über die ganze
{{form.as_p}}
Ansatz:PS. wenn Sie schon nicht Lesen, Sie voll und ganz empfehle ich herzlich, sich die Zeit zu gehen durch alle die Formulare-Dokumentation
form-data
form.save()
, aber es gibt keine änderungen. Aber es ist etwas seltsam hier: der Fehler wird zu werfen, indem Sie ein Kommentar. In meinem traceback:my_dir/views.py in list_files
#newdoc = Document(docfile = request.FILES['docfile'], phase = phase_id) ...
/home/lince/teams/env/lib/python2.6/site-packages/django/utils/datastructures.py in __getitem__
raise MultiValueDictKeyError("Key %r not found in %r" % (key, self)) ...
Wie ist das möglich?if form.is_valid()
wirft es Falsch. Wo ist der Ursprung des Problems?form.is_valid
Abfrage-spezifisch, sollte aber auch das lösen.newdoc = Document(docfile = request.FILES['docfile'], phase = phase_id)
zunewdoc = Document(docfile = request.FILES['docfile'], phase = phase)
und das ist alles! Danke für die Hilfe Mann!Modifizieren Post-Methode
Mehr, der versucht, die oben und konnte immer noch nicht herausfinden, eine Lösung. Hier ist, was ich getan habe:
views.py