मैं पूरी तरह से इस पर फंस गया हूं, और अविश्वसनीय रूप से बेवकूफ कुछ करना होगा। मैं बस एक 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 तक पहुँचने का प्रयास, मैं इस त्रुटि मिलती है किसी भी मदद की सराहना करते हैं कि मैं इसे काम पर क्यों नहीं ला सकता - ऐसा लगता है कि यह सरल होना चाहिए। मैं पीडीबी का उपयोग कर अपनी प्रोजेक्ट निर्देशिका में फ़ाइलों को मैन्युअल रूप से बना और लिख सकता हूं, इसलिए मुझे नहीं लगता कि अनुमतियां समस्या हैं ... समस्या फॉर्म में है?
लग रहा है अपने html प्रपत्र याद आ रही है की तरह नाम आपके इनपुट क्षेत्र में गुण, – Jingo
तरह की कोशिश कुछ चीजें जो मुझे संदिग्ध हैं। आपके फॉर्म इनपुट में 'name' विशेषताएँ अनुपलब्ध हैं। आप उप-वर्गीकरण 'फॉर्म' फार्म हैं 'लेकिन' मेटा 'वर्ग है जो दर्शाती है कि आप' फॉर्म 'मॉडलफॉर्म' चाहते हैं। यदि आप मॉडल फॉर्म का उपयोग करना चाहते हैं तो आपको दस्तावेज़ ऑब्जेक्ट को तुरंत चालू करने की आवश्यकता नहीं है क्योंकि फ़ॉर्म आपके लिए यह करता है। –
जीनियस - धन्यवाद! अगर आप इसे एक के रूप में सबमिट करते हैं तो मुझे उत्तर के रूप में स्वीकार करने में खुशी होगी ... – user