【问题标题】:FormSet rendering always two forms as default DjangoFormSet 始终呈现两个表单作为默认 Django
【发布时间】:2016-02-26 21:08:11
【问题描述】:

我的 FormSet 有以下代码:

Forms.py

class RequiredFormSet(BaseFormSet):
    def __init__(self, *args, **kwargs):
        super(RequiredFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False

CityFormSet = formset_factory(CityNameForm, min_num=1, max_num=5, validate_min=True, validate_max=True, formset=RequiredFormSet)

模板.html

{{ city_formset.management_form }}
{% for city_form in city_formset %}
{{ city_form.id }}
<div>
    {{ city_form.city_name }}
</div>

<div>
    {{ city_form.region }}
</div>
{% endfor %}

在表单集中创建和删除表单由 JavaScript 处理,但只有在单击按钮时才会激活。如果用户编辑 JavaScript 并删除它验证页面必须有多少个表单的条件,他可以提交该页面,而表单集中没有任何表单。

如果我在构造函数中设置min_num=0,用户就可以使用上面的方案并进行验证。如果我设置为min_num=1,他只能在formset中生成两个表单。

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    当然,只需更改此行:

    CityFormSet = formset_factory(CityNameForm, min_num=1, max_num=5, validate_min=True, validate_max=True, formset=RequiredFormSet)
    

    到这里:

    CityFormSet = formset_factory(CityNameForm, min_num=1, max_num=5,
                                  validate_min=True, validate_max=True,
                                  formset=RequiredFormSet, extra=0)
    

    还让你的行更短了,所以你不必滚动太多。

    【讨论】:

    • 是的,就是这样。如果您问我,将其默认为 1 有点愚蠢。它总是生成两种形式,你不知道为什么。感谢您的帮助!
    • 也许,但它在文档中。请注意,如果您提交,空表单将被忽略。我认为它的存在是为了让用户很明显可以添加更多内容。
    【解决方案2】:

    在 formset_factory 中有 extra 的选项,您可以作为 extra=2 使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2014-03-24
      相关资源
      最近更新 更多