使用Django ModelForm提交数据报错‘This field is required’求助
问题分析与解决办法
1. 表单缺少文件上传编码配置
你的表单包含FileField类型的documentFile字段,但HTML的<form>标签没加enctype="multipart/form-data",这会导致文件无法被正确提交,直接触发该字段的必填错误。
修改HTML代码:
{% extends 'base.html' %} {% block columncard %} <div class="container"> <!-- 添加文件上传编码属性 --> <form method="POST" enctype="multipart/form-data"> <fieldset> <legend>Form</legend> {% csrf_token %} {{ form.as_p }} <button type="submit" class="btn btn-primary">Submit</button> </fieldset> </form> </div> {% endblock %}
2. Uploader字段无需用户手动填写
uploader是关联当前登录用户的外键,没必要在表单里让用户选择,应该在视图里自动赋值给当前登录用户,避免用户未选择时触发必填错误。
修改forms.py:
class MyForm(forms.ModelForm): class Meta: model = Docstest # 移除uploader字段,不在表单中展示 fields = ["nameOfApplicant","serviceRequestedName","nameOfDocument","documentFile",] labels = { "nameOfApplicant":"申请人姓名", "serviceRequestedName":"申请服务", "nameOfDocument":"文件名称", "documentFile":"上传文件", }
修改视图函数(以函数视图为例):
from django.shortcuts import render, redirect from .forms import MyForm def upload_doc(request): if request.method == 'POST': # 必须传入request.FILES处理文件上传 form = MyForm(request.POST, request.FILES) if form.is_valid(): # 先暂存表单数据,不提交到数据库 doc_obj = form.save(commit=False) # 给uploader字段赋值当前登录用户 doc_obj.uploader = request.user doc_obj.save() return redirect('success_page') # 替换成你的成功跳转页面 else: form = MyForm() return render(request, '你的模板文件名.html', {'form': form})
如果用类视图(比如CreateView),可以这么改:
from django.views.generic.edit import CreateView from .models import Docstest from .forms import MyForm class DocCreateView(CreateView): model = Docstest form_class = MyForm success_url = '/success/' # 替换成你的成功跳转地址 def form_valid(self, form): # 自动赋值当前用户给uploader字段 form.instance.uploader = self.request.user return super().form_valid(form)
3. 检查关联模型是否有可用数据
serviceRequestedName和nameOfDocument是外键字段,如果对应的ServicesOffered和DocumentsRequired模型里没有数据,表单的下拉框会没有选项,用户无法选择,也会触发必填错误。先给这两个关联模型添加一些数据再测试。
内容的提问来源于stack exchange,提问作者Good Start Me
相关产品推荐
相关产品推荐

