Django使用model_formset批量更新用户时表单无法提交如何解决?
问题原因
- 模板代码中渲染Formset管理表单的属性写错了:你使用了
{{ formset.management_data }},但Django Formset用来渲染TOTAL_FORMS、INITIAL_FORMS等必填隐藏字段的正确属性是management_form,这就导致提交表单时这些必填字段完全缺失,直接触发校验失败。 - 视图代码中初始化Formset时没有传入用户查询集,即使修复模板问题,页面也不会加载现有用户的信息,无法实现批量编辑的需求。
- 原POST逻辑中校验失败直接重定向,会丢失表单错误信息,用户无法感知具体错误原因。
修改方案
1. 模板修改(仅改1行,保留原有表格布局)
找到模板中{{ formset.management_data }}这一行,替换为:
{{ formset.management_form }}
其余代码完全保留即可,不会影响你现有的行内表格展示效果。
2. 视图代码修改
调整后的完整视图代码如下:
@login_required def users(request): UserFormSet = modelformset_factory(User,fields=('username','first_name','last_name','email','is_contributor','is_projectmanager','is_administrator'), extra=0) # 统一查询用户集,GET和POST请求复用 user_queryset = User.objects.all() if request.method == 'POST': formset = UserFormSet(request.POST, queryset=user_queryset) if formset.is_valid(): formset.save() messages.success(request,"保存成功") return HttpResponseRedirect(reverse("bugtracker:users")) else: messages.error(request,"保存失败,请检查页面提示的错误信息") # 校验失败直接返回带错误的表单,不要重定向,保留错误提示 context = {'formset':formset} return render(request, 'bugtracker_app/users.html', context) # GET请求传入查询集,加载现有用户数据到表单 formset = UserFormSet(queryset=user_queryset) context = { 'formset':formset, } return render(request, 'bugtracker_app/users.html', context)
修改完成后即可实现批量编辑用户、提交后一次性保存所有修改的需求。
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

