我有这样的视图(修改以使其易于理解):
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-crisp -forms文档没有展示这种方法,因为它们专注于使用表单。我使用的是Django的CreateView,它为我创建了表单,所以我不需要一个表单类。
到目前为止,我注意到在编程添加新字段后做form.helper = FormHelper(form)
解决了问题。但这不是一个解决方案,因为我这里展示的视图是一个简化版本,实际上我有两个视图在做类似的事情。所以我继承了这个类,并在视图本身添加额外的字段(意味着FormHelper已经存在)。
解决方案:form.helper = FormHelper()
(注意我正在传递表单作为参数)
使用IDE导致我出现这个错误,因为类是FormHelper(form=None)
,所以我有一个form
参数,很容易陷入这个陷阱。在我看来,这并没有很好地解释,你必须深入研究代码来理解传递表单实际上构建了一个布局(也许form_for_layout
会是一个更好的命名,或者只是将form
添加到文档字符串中—我创建了一个问题,如果它被实现,将更新这个答案):
if form is not None:
self.form = form
self.layout = self.build_default_layout(form)
对于刚接触django-crisp -forms的人(我的例子),这会使事情变得复杂,因为它实际上定义了表单字段的呈现方式。这就是为什么在添加字段后添加FormHelper没有问题(它将字段添加到布局中!),但反过来做就不起作用了。
理解问题出在布局上,让我想到了其他解决方案。如果您需要布局,添加字段后的form.helper.layout = form.helper.build_default_layout(form)
(或del form.helper.layout
)也可以工作,但您将失去对布局所做的任何更改。