您好我正在学习Django项目,我正在尝试使用POST通过表单上传文件以及下拉列表中的on选项。 这是我的文件:
views.py
from __future__ import unicode_literals
from django.shortcuts import render
from django.http import HttpResponse
from .forms import UploadFileForm
# function to handle an uploaded file.
from save_uploaded_file import handle_uploaded_file
def index(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
return render(request, 'viewer_app/display_image.html')
else:
print('error')
return render(request, 'viewer_app/index.html', {'form': form})
else:
return render(request, 'viewer_app/index.html')
forms.py
from django import forms
class UploadFileForm(forms.Form):
file = forms.FileField()
displayType = forms.ChoiceField(widget=forms.Select(), required=True)
save_uploaded_file.py
def handle_uploaded_file(f):
with open('static/viewer_app/temp.exr', 'wb+') as recieved_exr:
for chunk in f.chunks():
recieved_exr.write(chunk)
的index.html
<div id="formDiv" style="display:none;" class="form" >
<form method="post" enctype="multipart/form-data" class="form-style">
<label for="browse">Upload file</label>
<input type="file" value="Browse" id="brow" /><br></br>
<label for="display">Display type</label>
<select id="display-type" name="display">
<option id="RGB1" value="RGB1">RGB1</option>
<option id="RGB2" value="RGB2">RGB2</option>
<option id="RGB3" value="RGB3">RGB3</option>
<option id="RGB4" value="RGB4">RGB4</option>
</select><br></br>
<input type="submit" value="Show file" id="showimage"/><br></br>
{% csrf_token %}
</form>
</div>
因此,在我运行服务器以显示页面并选择上传并单击提交后,它不会上传并保存文件,在终端中我看到&#34;错误&#34;由于from.is_valid()不正确而显示的终端中的文本。
我尝试将{{ form.errors }} {{ form.non_field_errors }}
添加到html文件中,但我仍然不知道我做错了什么。
答案 0 :(得分:1)
此外,我可以在<input>
标记中看到名称属性的缺失,以及<select>
标记内可能存在错误的名称属性。您应该将字段的确切名称放在html的name属性中,以使表单有界限。 <select>
标签也是如此。
尝试推杆:
<input type="file" value="Browse" id="brow" name="file"/>
和
<select id="display-type" name="displayType">
可能你的问题将会解决。
如果我建议,为什么不使用标准的django模板表单标签,例如{{ form.as_p }}
?这些方法非常方便,也可以成功处理错误。你应该尝试使用它们。 check them here
修改强>
您尚未在forms.py中为ChoiceField
提供任何选择属性。确保将属性choices
作为元组提供给ChoiceField。可以这样做:
#import ugettext_lazy
from django.utils.translation import ugettext_lazy as _
#inside your form class
class UploadFileForm(forms.Form):
CHOICES = (
('RGB1', _('RGB1')),
('RGB2', _('RGB2')),
('RGB3', _('RGB3')),
#And so on
)
#First option in the tuple is stored in db. Second is displayed in Forms.
displayType = forms.ChoiceField(widget=forms.Select(), required=True , choices = CHOICES)
file = forms.FileField()
编辑2:
获取文件网址,如下所示
from django.contrib.staticfiles.templatetags.staticfiles import static
url = static('viewer_app/temp.exr')
#See if temp.exr exists prior to this. Otherwise create a file manually or through python.
然后通过提供此URL打开文件。
我再次建议您查看ModelForms。它们完全不需要以这种方式编写文件。
希望它有所帮助。感谢。