Django 表单:当文件发布到带有 enctype 的文件字段时,“此字段是必需的”
Posted
技术标签:
【中文标题】Django 表单:当文件发布到带有 enctype 的文件字段时,“此字段是必需的”【英文标题】:Django forms: “This field is required” when file POSTed to file field WITH enctype 【发布时间】:2018-09-08 00:22:49 【问题描述】:我无法上传文件并收到“此字段为必填项”。到目前为止,它与here 报告的问题相同。但是,我我使用enctype="multipart/form-data"
,就像那个问题中建议的那样。
型号:
class ContentSheet(models.Model):
content_sheet_name = models.CharField(max_length=500)
content_sheet_file = models.FileField()
形式:
class ContentSheetForm(forms.ModelForm):
content_sheet_name = forms.CharField(max_length=50)
content_sheet_name.widget.attrs.update('autofocus': 'autofocus', 'placeholder': 'Content Sheet Name')
content_sheet_file = forms.FileField()
class Meta:
model = ContentSheet
exclude = tuple()
观点:
def add_user_sentence(request):
statistics_context = get_statistics()
if request.method == 'POST':
form = ContentSheetForm(request.POST, request.FILES)
if form.is_valid():
# Save the new sentence to the database.
form.save(commit=True)
print "form.content_sheet_file", form.content_sheet_file
...
else:
print form.errors
else:
# If the request was not a POST, display the form to enter details.
form = ContentSheetForm()
# Bad form (or form details), no form supplied...
# Render the form with error messages (if any).
context = 'user_sentence_form': form
return render(request, 'lf_classifier/insert_text.html', context)
HTML:
<form id="user_sentence_form" method="post" enctype="multipart/form-data" action="/lf_classifier/send_text/">
% csrf_token %
% for field in user_sentence_form.visible_fields %
field.errors
field.help_text
field
% endfor %
<input type="submit" data-icon="action" data-iconpos="right" name="submit" data-inline="true" value="upload" />
</form>
【问题讨论】:
显示您的 ContentSheet 模型ContentSheet
中是否还有其他字段,或者只是content_sheet_name
和content_sheet_file
?您在哪个字段上得到错误?它有什么价值吗?
你需要在你的模型中提到一个路径,比如FileField(upload_to='directory_name/')
@Exprator,我添加了 upload_to='uploads/' 但它仍然不起作用并给出相同的消息
你的观点在哪里?
【参考方案1】:
您尚未将文件数据传递给表单。
form = ContentSheetForm(request.POST, request.FILES)
【讨论】:
赞成并更新您在问题中的修复 - 但仍然遇到相同的错误:(【参考方案2】:添加data-ajax="false"
解决了我的问题。固定的 HTML:
<form id="user_sentence_form" method="post" enctype="multipart/form-data" data-ajax="false" action="/lf_classifier/send_text/">
% csrf_token %
% for field in user_sentence_form.visible_fields %
field.errors
field.help_text
field
% endfor %
<input type="submit" data-icon="action" data-iconpos="right" name="submit" data-inline="true" value="upload" />
</form>
【讨论】:
以上是关于Django 表单:当文件发布到带有 enctype 的文件字段时,“此字段是必需的”的主要内容,如果未能解决你的问题,请参考以下文章
python测试开发django-178.ajax实现form表单文件上传
当存在enctype属性时,"name "属性的值没有被发送到表单中(Express, Mongo, Node)。