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.errorsform.user.errors→form.donor.errorsform.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
相关产品推荐
相关产品推荐

