如何让Django ModelFormset提交后保持固定表单数量?
解决Django ModelFormset提交后表单数量变化的问题
问题核心:默认ModelFormset会自动加载所有已保存的模型对象作为表单,再加上extra指定的空表单,导致提交后表单数量不断增加。要实现固定数量的表单,需按以下步骤调整:
关键修改点
1. 强制Formset只显示空表单
创建Formset实例时,通过queryset=Author.objects.none()让Formset不加载任何已存在的对象,只生成extra指定数量的空表单。
2. 提交成功后重新生成空Formset
表单验证保存成功后,不要直接返回用过的Formset实例,而是重新创建一个全新的空Formset,确保页面始终显示固定数量的表单。
修改后的代码
views.py
from django.shortcuts import render from .models import Author from .forms import AuthorForm from django.forms import modelformset_factory def test(request): # 使用自定义的AuthorForm创建Formset,指定extra为固定数量(比如3) AuthorFormSet = modelformset_factory(Author, form=AuthorForm, extra=3) if request.method == 'POST': formset = AuthorFormSet(request.POST, request.FILES, queryset=Author.objects.none()) if formset.is_valid(): formset.save() # 提交成功后,重新生成空的Formset formset = AuthorFormSet(queryset=Author.objects.none()) else: # GET请求时,直接生成空的Formset formset = AuthorFormSet(queryset=Author.objects.none()) return render(request, 'voting/test.html', {'formset': formset})
补充说明
- 如果需要保留部分已保存对象的表单,可调整
queryset为特定筛选结果,同时配合max_num参数限制总表单数量,确保总数固定。 modelformset_factory的max_num参数可以严格限制Formset的最大表单数量,和extra搭配使用能更好地控制表单总数。
内容的提问来源于stack exchange,提问作者Annelotte
相关产品推荐
相关产品推荐

