html - request.FILES always empty on file upload -
i totally stumped on this, , must doing incredibly stupid. trying upload file on django project. problem seems no form data getting passed through server--only csrf token. running django 1.5.1, python 2.7, virtualenv, on mac, , using built-in django development server.
my html form is:
{% load url 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>
my model:
from django.db import models class document(models.model): file = models.filefield(upload_to='/media/', blank=true, null=true)
my forms.py:
from django import forms .models import document class documentform(forms.form): """ handle uploading grades csv file """ class meta: models = document
my views.py:
def report(request): """ process csv file remove inactive students manipulate right json format chart 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 spent several hours searching solution, nothing seems work. i have enctype set correctly (i think), i using input type 'submit' form, , i binding form data model (doesn't matter, since request.files empty). tried using direct url in form action (action='/report/showreport/') per this django newbie page, didn't make difference. far can tell, there no other scripts binding form submit action , overriding default action.
i realize code above should likley request.files['grades_csv'] match form's input id...yet doesn't matter yet, since request.files empty.
in trying debug, have set pdb trace right before if request.method == "post" in view. using console, can see request.post not include hidden "testing" input, , request.files empty. when run in browser, returns me form page, saying form invalid. pdb results here:
(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']}>
if try access request.files in views.py without checking if form valid, error:
"key 'file' not found in <multivaluedict: {}>"
i stumped , appreciate on why cannot work--it seems should simple. can manually create , write files within project directory using pdb, don't think permissions problem...the problem in form?
i had problem , puzzling on while. error same -- missing necessary fields on input
field.
in order see required fields are, nice thing is, in case:
from base.forms import documentform ## or put whatever name of app, unspecified in question print documentform()
this print html need, including tags object requires. neat functionality missed first time, outlined in the docs.
Comments
Post a Comment