在 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
)也可以,但您将丢失对布局所做的任何更改。
我有这样的看法(为便于理解而修改):
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
)也可以,但您将丢失对布局所做的任何更改。