在 Django 视图中添加的字段未显示为 django-crispy-forms

fields added in Django View not displayed with django-crispy-forms

我有这样的看法(为便于理解而修改):

class MyCreateViewView(CreateView):

    model = SomeModel

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.helper = FormHelper(form)

        form.fields['additional_field'] = forms.BooleanField(label="Something", required=False)

        form.helper.add_input(Submit('submit', "Submit"))

        return form

在添加 FormHelper 之前,字段 additional_field 出现在模板中。现在不是了。我模板中的表格基本上是一行:{% crispy form %}.

django-crispy-forms docs 没有展示这种方法,因为他们专注于使用表单。我正在使用 Django 的 CreateView 为我构建表单,所以我不需要表单 class.

到目前为止,我注意到在以编程方式添加新字段后执行 form.helper = FormHelper(form) 可以解决问题。但这不是解决方案,因为我在这里展示的视图是一个简化版本,实际上我有两个视图在做类似的事情。所以我继承了这个 class 并在视图本身中添加了额外的字段(意味着 FormHelper 已经存在)。

解决方案:form.helper = FormHelper()(注意我将表单作为参数传递)

使用 IDE 导致我出现这个错误,因为 class 是 FormHelper(form=None) 所以我有一个 form 参数,很容易陷入这个陷阱。在我看来,这个解释得不好,你必须dig into the code to understand that passing the form actually builds a Layout (maybe form_for_layout would be a better naming or simply adding form to the docstring - I created an issue这个建议,如果实施会更新这个答案):

if form is not None:
    self.form = form
    self.layout = self.build_default_layout(form)

对于 django-crispy-forms 的新手(我的情况),这使事情变得复杂,因为它实际上定义了表单字段的呈现方式。这就是为什么在添加字段后添加 FormHelper 没有问题(它将字段添加到布局中!),但反过来却不起作用。

了解问题出在布局中让我想到了其他解决方案。如果您需要布局,添加字段后 form.helper.layout = form.helper.build_default_layout(form)(或 del form.helper.layout)也可以,但您将丢失对布局所做的任何更改。