这必须是一个基本问题,但我在Djnago非常新,并试图了解表单的工作原理。我查看了不同的网站和论坛,但我还没有理解我做错了什么。
这是我的表格:
class UploadCSVForm(forms.Form):
csv_file = forms.FileField()
这是一个非常简单的表格,用于上传CSV文件。
这就是我的看法:
def layer_create(request, template='layers/layer_create.html'):
if request.method == 'POST':
form = UploadCSVForm(request.POST, request.FILES)
#print form.is_bound # THIS PRINTS TRUE
#print (request.FILES['csv']) # THIS PRINTS THE FILE IN THE MEMORY
if form.is_valid():
print ("valid")
else:
print ("not valid")
out = {'success': False}
return HttpResponse('test site')
这是我的模板中的表格:
<form id="file-uploader" method="post" enctype="multipart/form-data" action="{% url "layer_create" %}">
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
<input type="file" id="file-input" name="csv" />
<button type="submit" id="upload-button" class="btn btn-danger">Upload</button>
</form>
使用函数is_bound
我看到表单上有实际数据绑定。
当我打印:request.FILES['csv']
时,我可以看到内存中上传文件的名称。
但我仍然得到form.is_valid = False
没有蚂蚁错误或警告。
答案 0 :(得分:2)
您已在模板csv
中命名该字段,但该表单希望将其命名为csv_file
。
通常你应该让Django输出模板中的字段,这样可以避免这样的问题。 (它通常也会在错误后重新显示字段时预先填充字段,但出于浏览器安全原因,文件字段不会发生这种情况。)
{{ form.csv_file }}