You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:39:03