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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:23:30