Django提交反馈表单报Field 'id' expected a number错误如何解决
错误根因
错误的根本原因是你直接将request.POST作为位置参数传入了模型FeedbackForm的构造方法,Django模型构造方法的第一个位置参数对应主键id字段,因此你相当于把整个QueryDict对象赋值给了id字段,触发了「期望数字但得到QueryDict」的类型错误,和id是否自动生成无关。
解决方法
- 优先使用你已经定义的ModelForm处理数据(自带字段校验、类型转换逻辑,是Django标准写法),将
FeedbackFormResult视图代码修改为:
class FeedbackFormResult(View): def post(self, request, *args, **kwargs): form = FeedbackForm(request.POST) # 校验数据合法性 if form.is_valid(): # 校验通过后直接保存form,自动生成模型实例 form.save() # 回传form到模板可以展示校验错误提示,建议提交成功后重定向到成功页避免重复提交 return render(request, "feedback_forms/feedback_form.html", {"form": form})
- 如果需要直接操作模型实例,不要直接传
request.POST作为位置参数,改用关键字参数传值:
class FeedbackFormResult(View): def post(self, request, *args, **kwargs): feedback_form_model = apps.get_model(app_label="feedback_forms", model_name="FeedbackForm") # 拆包POST字典为关键字参数,或者手动逐个赋值字段 new_feedback = feedback_form_model(**request.POST.dict()) new_feedback.save() return render(request, "feedback_forms/feedback_form.html")
额外注意事项
你的模型类和ModelForm类都命名为FeedbackForm,容易出现命名空间冲突,建议将ModelForm重命名为FeedbackModelForm避免调用时混淆;同时你当前配置了表单onsubmit="return false",如果是AJAX提交请确保表单数据完整序列化上传;另外你已经定义了FeedbackFormView继承FormView,完全可以复用FormView的form_valid方法处理提交逻辑,不需要单独写FeedbackFormResult视图,更符合Django最佳实践。
内容的提问来源于stack exchange,提问作者Trts
相关产品推荐
相关产品推荐

