2013-07-17 5 views
5

मैं पूरी तरह से इस पर फंस गया हूं, और अविश्वसनीय रूप से बेवकूफ कुछ करना होगा। मैं बस एक Django परियोजना पर एक फाइल अपलोड करने की कोशिश कर रहा हूँ। समस्या यह प्रतीत होती है कि सर्वर के माध्यम से कोई फॉर्म डेटा पास नहीं हो रहा है - केवल सीएसआरएफ टोकन। मैं एक मैक पर Django 1.5.1, पायथन 2.7, वर्चुअलएन्व, और अंतर्निहित Django विकास सर्वर का उपयोग कर रहा हूँ।request.FILES हमेशा फ़ाइल अपलोड पर खाली

मेरे एचटीएमएल रूप है:

{% 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> 

मेरे मॉडल:

from django.db import models 

class Document(models.Model): 
file = models.FileField(upload_to='/media/', blank=True, null=True) 

मेरे forms.py:

from django import forms 
from .models import Document 

class DocumentForm(forms.Form): 
""" 
to handle uploading grades csv file 
""" 
class Meta: 
    models = Document 

मेरे 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 }) 

मैंने समाधान खोजने के लिए कई घंटे बिताए हैं, लेकिन कुछ भी काम नहीं करता है। I have the enctype set correctly (मुझे लगता है), I am using input type 'submit' for the form, और I am binding the form data to my model (कोई फर्क नहीं पड़ता, अनुरोध के बाद से। FILES खाली है)। मैंने अपने फॉर्म एक्शन (एक्शन = '/ रिपोर्ट/शोरपोर्ट /') में this Django newbie page प्रति प्रत्यक्ष यूआरएल का उपयोग करने का भी प्रयास किया, लेकिन इससे कोई फर्क नहीं पड़ता। जहां तक ​​मैं कह सकता हूं, फ़ॉर्म सबमिट करने और डिफ़ॉल्ट कार्रवाई को ओवरराइड करने के लिए बाध्यकारी कोई अन्य स्क्रिप्ट नहीं है।

मुझे यह भी एहसास है कि ऊपर दिए गए कोड को सबसे अधिक पसंद किया जाना चाहिए। FILES ['grade_csv'] फॉर्म के इनपुट आईडी से मेल खाने के लिए ... फिर भी यह अनुरोध के बाद से कोई फर्क नहीं पड़ता। FILES खाली है।

डीबग करने की कोशिश में, मैंने अपने अनुरोध में if request.method == "POST" से ठीक पहले एक पीडीबी ट्रेस सेट किया है। कंसोल का उपयोग करके, मैं देख सकता हूं कि मेरा अनुरोध। POST में मेरा छुपा "परीक्षण" इनपुट शामिल नहीं है, और वह अनुरोध। FILES खाली है। जब मैं इसे ब्राउज़र में चलाता हूं, तो यह मुझे मेरे फॉर्म पेज पर लौटाता है, अनिवार्य रूप से कहता है कि मेरा फॉर्म अमान्य है। मेरे pdb परिणाम यहां हैं:

"Key 'file' not found in <MultiValueDict: {}>" 

मैं स्टंप्डया हूँ और:

(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']}> 

अगर मैं पता चल सके कि विधि मान्य बिना मेरे views.py में request.FILES तक पहुँचने का प्रयास, मैं इस त्रुटि मिलती है किसी भी मदद की सराहना करते हैं कि मैं इसे काम पर क्यों नहीं ला सकता - ऐसा लगता है कि यह सरल होना चाहिए। मैं पीडीबी का उपयोग कर अपनी प्रोजेक्ट निर्देशिका में फ़ाइलों को मैन्युअल रूप से बना और लिख सकता हूं, इसलिए मुझे नहीं लगता कि अनुमतियां समस्या हैं ... समस्या फॉर्म में है?

+4

लग रहा है अपने html प्रपत्र याद आ रही है की तरह नाम आपके इनपुट क्षेत्र में गुण, Jingo

+4

तरह की कोशिश कुछ चीजें जो मुझे संदिग्ध हैं। आपके फॉर्म इनपुट में 'name' विशेषताएँ अनुपलब्ध हैं। आप उप-वर्गीकरण 'फॉर्म' फार्म हैं 'लेकिन' मेटा 'वर्ग है जो दर्शाती है कि आप' फॉर्म 'मॉडलफॉर्म' चाहते हैं। यदि आप मॉडल फॉर्म का उपयोग करना चाहते हैं तो आपको दस्तावेज़ ऑब्जेक्ट को तुरंत चालू करने की आवश्यकता नहीं है क्योंकि फ़ॉर्म आपके लिए यह करता है। –

+0

जीनियस - धन्यवाद! अगर आप इसे एक के रूप में सबमिट करते हैं तो मुझे उत्तर के रूप में स्वीकार करने में खुशी होगी ... – user

उत्तर

1

मुझे यह समस्या भी थी और थोड़ी देर के लिए इस पर परेशान था। मेरी त्रुटि एक जैसी थी - कि मुझे input फ़ील्ड पर आवश्यक फ़ील्ड याद आ रही थीं।

आदेश वास्तव में आवश्यक फ़ील्ड, करने के लिए एक बहुत अच्छी बात है, क्या कर रहे हैं इस मामले में देखने के लिए: कि इस वस्तु

from base.forms import DocumentForm ## or put whatever the name is of the app, which is unspecified in the question 
print DocumentForm() 

यह एचटीएमएल है कि आप की जरूरत है, सभी टैग सहित प्रिंट होगा की आवश्यकता है। बहुत साफ कार्यक्षमता जिसे मैंने पहली बार याद किया, लेकिन the docs.

+0

क्या आप एक उदाहरण दे सकते हैं? – shenk

3

में उल्लिखित है कि आपने enctype संपत्ति form टैग में जोड़ा है।

उदाहरण official docs से: <form enctype="multipart/form-data" method="post" action="/foo/">

+0

बिल्कुल सही समाधान। enctype = "multipart/form-data" ने मेरे लिए चाल की है। वास्तव में सहायक धन्यवाद @ कुज़नेत्सोव – Doogle

संबंधित मुद्दे