一尘不染

Django表单集:首先需要吗?

django

这些表单集表现出与我想要的相反的行为。

我的视图设置如下:

def post(request): # TODO: handle vehicle formset
    VehicleFormSetFactory = formset_factory(VehicleForm, extra=1)
    if request.POST:
        vehicles_formset = VehicleFormSetFactory(request.POST)
    else:
        vehicles_formset = VehicleFormSetFactory()

我的模板如下所示:

    <div id="vehicle_forms">
        {{ vehicles_formset.management_form }}
        {% for form in vehicles_formset.forms %}
            <h4>Vehicle {{forloop.counter}}</h4>
            <table>
                {% include "form.html" %}
            </table>
        {% endfor %}
    </div>

这样,像我想要的那样,它最初仅生成1种形式。但是我想要一种表格!

当我使用JavaScript动态添加空白表单时,vehicles_formset.empty_form所有这些多余的表单都是必需的,而这是我所不希望的。

从文档:

表单集足够聪明,可以忽略未更改的其他表单。

这是第一种形式展示的行为(不是我想要的),而不是其他形式展示的行为(我想要的)。

我是否可以更改某些属性以至少要求填写一种表格?


阅读 384

收藏
2020-03-27

共1个答案

一尘不染

找到了更好的解决方案:

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

然后像这样创建表单集:

MyFormSet = formset_factory(MyForm, formset=RequiredFormSet)

我真的不知道为什么这不是一个开始的选择……但是,无论如何。我一生只花了几个小时就弄明白了。

这将形成所需的所有表格。你可以通过设置self.forms[0].empty_permitted为来制作所需的第一个False

2020-03-27