2017-05-03 3 views
0

Ich entwickle eine Anwendung mit Django zum Hochladen einer Datei auf dem Server. Ich habe ein Formular und ein Modell in forms.py und models.py Dateien separat als unten (jeweils) definiert:Hochladen einer Datei mit Django

from django import forms 

class DocumentForm(forms.Form): 
    docfile = forms.FileField(
     label='' 
    ) 

und in models.py:

from django.db import models 

# Create your models here. 

    class Document(models.Model): 
     docfile = models.FileField(upload_to='targetdir') 

in meiner HTML-Datei und meine Form:

<form class="myclass" action="submit" method="post"> 
    {% csrf_token %} 

    <p> 
       {{ form.docfile.errors }} 
       {{ form.docfile }} 
</p> 


     <br /> 
      <input font-size="50px" style="zoom:1.5" class="myclass" dir="rtl" type="submit" value="upload" id="button" class="top-menu" onclick="pythonhandler()" /> 

jetzt, wenn ich meine Form einreichen und ich möchte über unter Codes meine hochgeladene Datei auf dem Server erhalten, bekam ich "

raise MultiValueDictKeyError(repr(key)) 
MultiValueDictKeyError: "'docfile'"" 

Fehler. meine views.py Datei:

def pythonhandler(request): 

    if request.method == 'POST': 
     try: 
        data = request.FILES.get('docfile') 
        with open(os.getcwd()+'/mydirectory/'+request.FILES['docfile'].name, 'wb+') as destination: 
         for chunk in request.FILES['docfile'].chunks(): 
          destination.write(chunk) 

Ich habe die genannten Schritte in this, this und this Frage, aber ich erhalte diesen Fehler wieder!

+1

Bitte können Sie etwas konkreter über Ihr HTML-Formular und views.py? Haben Sie Folgendes gelesen: https://docs.djangoproject.com/en/1.11/topics/http/file-uploads/? Vielleicht könnte es nützlich sein. –

+0

Ich habe meine Frage bearbeitet. Ich habe Ihren erwähnten Link gelesen und alles, was ich denke, ist ein Beispiel. aber ich habe keine Ahnung von dem Fehler. – Stateless

+1

Beachten Sie, dass request.FILES nur Daten enthält, wenn die Anforderungsmethode POST ist und die

, die die Anfrage gesendet hat, das Attribut enctype = "multipart/form-data" hat. Also vermisse ich es in Ihrem Formular-Tag –

Antwort

0

Ich habe enctype = "multipart/form-data" Befehl in meinem Formular-Tag in meiner HTML-Datei verpasst. So muss meine Form in der HTML-Datei sein, wie unten:

<form class="myclass" action="submit" enctype="multipart/form-data" method="post"> 
    {% csrf_token %} 

    <p> 
       {{ form.docfile.errors }} 
       {{ form.docfile }} 
</p> 
      <input type="submit" value="upload" id="button" class="top-menu" onclick="pythonhandler()" /> 
1

Ihrer Ansicht Funktion

def pythonhandler(request): 
data = DocumentForm(request.POST, request.FILES) 

und in der HTML-Datei

<form class="myclass" action="submit" enctype="multipart/form-data" method="post"> 
    {% csrf_token %} 

    <p> 
       {{ form.docfile.errors }} 
       {{ form.docfile }} 
</p> 
      <input type="submit" value="upload" id="button" class="top-menu" onclick="pythonhandler()" /> 
+0

Das Problem lag an enctype =" multipart/form-data "Attribut in meiner Form View-Funktion ist in Ordnung – Stateless

+0

jsut gab einen kleineren Weg, wie auch immer Vergnügen, dass es geholfen hat – Exprator