Django UpdateView中form_valid设置datecompleted未生效问题咨询
问题根因
你的逻辑存在两处核心问题,导致datecompleted字段没有更新:
- 表单校验未通过,
form_valid方法根本没有执行:你在CompletionChecklistForm中定义了需要提交vessels_name、datecompleted两个字段,但模板的表单内没有渲染任何对应输入控件,提交时这两个字段为空,只要模型中这两个字段是必填项,表单校验就会失败,不会进入form_valid的自定义逻辑。 - 就算表单校验通过,赋值结果也会被覆盖:你在
form_valid中先手动保存了修改后的实例,后续调用父类form_valid方法时,Django的UpdateView默认会再次执行form.save(),用表单提交的空datecompleted值覆盖你刚刚设置的时间。
修复方案
1. 调整表单定义
如果你的业务逻辑不需要用户手动输入vessels_name和datecompleted,直接移除表单字段即可:
class CompletionChecklistForm(forms.ModelForm): class Meta: model = CheckList fields = []
如果需要用户修改vessels_name,保留对应字段即可。
2. 调整视图逻辑
移除自定义的手动save逻辑,修改实例后直接交给父类处理即可,避免重复保存导致的覆盖问题:
class CompleteItemView(UpdateView): model = CheckList form_class = CompletionChecklistForm template_name = 'completion_checklist.html' success_url = reverse_lazy('home') def form_valid(self, form): form.instance.datecompleted = timezone.now() return super().form_valid(form)
3. (可选)模板调整
如果保留了用户输入字段,需要在模板的表单内添加字段渲染代码:
<form method="post"> {% csrf_token %} {{ form.as_p }} <div class="clearfix"> <button class="btn btn-danger float-left" type="submit">Yes</button> <a href="{% url 'home' %}" class="btn btn-secondary float-right">No, back</a> </div> </form>
内容的提问来源于stack exchange,提问作者Ches_Ter
相关产品推荐
相关产品推荐

