【问题标题】:fields added in Django View not displayed with django-crispy-forms在 Django 视图中添加的字段未使用 django-crispy-forms 显示
【发布时间】:2021-03-13 15:53:44
【问题描述】:

我有这样的观点(修改以使其易于理解):

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 为我构建表单,所以我不需要表单类。

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

【问题讨论】:

    标签: python django django-crispy-forms


    【解决方案1】:

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

    使用 IDE 导致我出现这个错误,因为类是 FormHelper(form=None),所以我有一个 form 参数,很容易陷入这个陷阱。在我看来,这没有得到很好的解释,你必须dig into the code 才能理解传递表单实际上构建了一个Layout(也许form_for_layout 会是一个更好的命名或者只是将form 添加到文档字符串中 - 我使用此建议创建了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)也可以,但您对布局所做的任何更改都会丢失。

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 2019-07-14
      • 2021-10-24
      • 2020-11-11
      • 2014-12-07
      • 2012-08-22
      • 1970-01-01
      • 2017-09-10
      • 2012-04-25
      相关资源
      最近更新 更多