在Django View中添加的字段不会在Django -crisp -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-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)也可以工作,但您将失去对布局所做的任何更改。

最新更新