use*_*ser 8 html forms django file django-forms
我对这件事感到非常难过,而且必须做一些非常愚蠢的事情.我想在Django项目上上传一个文件.问题似乎是没有表单数据传递到服务器 - 只有csrf令牌.我在Mac上运行Django 1.5.1,python 2.7,virtualenv,并使用内置的Django开发服务器.
我的HTML表单是:
{% 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>
Run Code Online (Sandbox Code Playgroud)
我的模特:
from django.db import models
class Document(models.Model):
file = models.FileField(upload_to='/media/', blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
我的forms.py:
from django import forms
from .models import Document
class DocumentForm(forms.Form):
"""
to handle uploading grades csv file
"""
class Meta:
models = Document
Run Code Online (Sandbox Code Playgroud)
我的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 })
Run Code Online (Sandbox Code Playgroud)
我花了几个小时寻找解决方案,但似乎没有任何效果.我正确设置了enctype(我认为),我使用输入类型'submit'作为表单,我将表单数据绑定到我的模型(无关紧要,因为request.FILES为空).我也尝试在我的表格动作(action ='/ report/showreport /')中使用这个Django新手页面中的直接网址,但这并没有什么区别.据我所知,没有其他脚本绑定到表单提交操作并覆盖默认操作.
我也意识到上面的代码最应该是request.FILES ['grades_csv']来匹配表单的输入id ......但是这也没关系,因为request.FILES是空的.
在尝试调试时,我在我的视图中的if request.method =="POST"之前设置了一个pdb跟踪.使用控制台,我可以看到我的request.POST不包含我隐藏的"测试"输入,并且该request.FILES为空.当我在浏览器中运行它时,它只是将我返回到我的表单页面,基本上说我的表单无效.我的pdb结果在这里:
(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']}>
Run Code Online (Sandbox Code Playgroud)
如果我尝试访问我的views.py中的request.FILES而不检查表单是否有效,我收到此错误:
"Key 'file' not found in <MultiValueDict: {}>"
Run Code Online (Sandbox Code Playgroud)
我很难过,并感谢任何帮助,为什么我不能让它工作 - 看起来它应该很简单.我可以使用pdb手动创建和写入我的项目目录中的文件,所以我认为权限不是问题...问题在于表单?
小智 6
我希望您已经解决了这个问题。我遇到了完全相同的问题,我发现输入标签中没有 name 属性
<input type="file" id="grade_csv" />
这就是你的输入。
如果它没有名称,django 将不会接受它。所以添加 name 属性就可以正常工作了。