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

Django UpdateView无法保存修改至数据库问题咨询

Django UpdateView无法保存数据且不跳转问题排查

问题现象

使用Django的UpdateView更新Toy对象时,提交修改后页面不跳转至success_url,返回状态码为200(正常更新成功应为302),手动返回后修改未保存,终端无报错,其他同类视图功能正常。

问题根源与修复方案

1. 视图继承顺序错误

Django类视图的Mixin需要放在基类左侧,Python方法解析顺序为从左到右。当前继承顺序ToyUpdateView(UpdateView, FormSubmittedInContextMixin)会导致自定义的form_invalid方法无法正确覆盖UpdateView的对应方法,干扰表单验证后的流程。

修复代码:

class ToyUpdateView(FormSubmittedInContextMixin, UpdateView):
    model = Toy
    form_class = ToyForm
    template_name = "main/updatetoy.html"
    success_url = reverse_lazy('toys:GiftingListOverview')

2. 表单Widget类型不匹配

表单中多个字段的Widget与模型字段类型不兼容,导致表单静默验证失败,无法触发保存和跳转:

  • list(ForeignKey):TextInput无法传递有效的外键ID,需改用ModelChoiceField配合Select组件。
  • donor(ForeignKey to User):TextInput无法匹配User实例,需改用ModelChoiceField或HiddenInput(若无需用户修改)。
  • description(TextField):TextInput限制输入体验,应改用Textarea。
  • image(ImageField):TextInput无法处理文件上传,需改用ClearableFileInput。

修复代码:

from django.contrib.auth.models import User

class ToyForm(forms.ModelForm):
    class Meta:
        model = Toy
        widgets = {
            'list': forms.ModelChoiceField(
                queryset=GiftingList.objects.all(), 
                required=True, 
                widget=forms.Select(attrs={'class': 'form-control'})
            ),
            # 若donor无需用户修改,可替换为HiddenInput
            'donor': forms.ModelChoiceField(
                queryset=User.objects.all(), 
                required=True, 
                widget=forms.Select(attrs={'class': 'form-control'})
            ),
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
            'image': forms.ClearableFileInput(attrs={'class': 'form-control'}),
        }
        fields = ('list', 'donor', 'name', 'description', 'image')

3. 模板错误信息绑定错误

模板中错误信息的字段名与表单字段不匹配,导致验证失败时无法显示错误提示,无法感知表单未通过验证:

  • form.label.errors → form.list.errors
  • form.user.errors → form.donor.errors
  • form.details.errors → form.name.errors
  • 所有错误信息需对应到正确的表单字段。

修复后的toy_form.html:

<section class="django-forms">
    <div class="form-group">
        <b>Liste:</b>
        {{ form.list }}
        <div class="invalid-feedback">
            {{ form.list.errors }}
        </div>
    </div>
    <div class="form-group">
        <b>Author:</b>
        {{ form.donor }}        
        <div class="invalid-feedback">
            {{ form.donor.errors }}
        </div>
    </div>
    <div class="form-group">
        <b>Name:</b>
        {{ form.name }}
        <div class="invalid-feedback">
            {{ form.name.errors }}
        </div>
    </div>
    <div class="form-group">
        <b>Beschreibung:</b>
        {{ form.description }}
        <div class="invalid-feedback">
            {{ form.description.errors }}
        </div>
    </div>
    <div class="form-group">
        <b>Image:</b>
        {{ form.image }}
        <div class="invalid-feedback">
            {{ form.image.errors }}
        </div>
    </div>
</section>

验证修复效果

修复后提交表单:

  • 若表单验证通过,会返回302跳转至success_url,修改内容成功保存。
  • 若验证失败,页面会显示对应字段的错误提示,便于排查问题。

内容的提问来源于stack exchange,提问作者davetodave178

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:01:27