我正在尝试使用Django表单(使用Crispy表单呈现),其中显示的表单字段取决于从视图传递给Form的参数。我相信参数会正确传递,但仍然会显示所有表单字段。
模型" IndividualFeedback"包含可用于各种不同评估类型的字段,并有8个字段用于反馈类别。显示的数量应取决于我在视图中指定的评估类型。我想要" ESSAY"评估类型显示其中4个类别字段,以及"演示"要显示的类型3.目前,无论我传递的是什么,我都会得到所有8个。
这是我的forms.py:
class IndividualFeedbackForm(forms.ModelForm):
mark = forms.IntegerField() # One additional field that's not in the model
helper = FormHelper()
def __init__(self, *args, **kwargs):
marksheet_type = kwargs.pop('marksheet_type')
super(IndividualFeedbackForm, self).__init__(*args, **kwargs)
helper = FormHelper()
if marksheet_type == 'ESSAY':
print('Detects marksheet') # Just for testing - and it does...
helper.layout = Layout(
'marker',
'marking_date',
'submission_date',
Field('category_mark_1', label=CATEGORIES['ESSAY']['i-1']),
Field('category_mark_2', label=CATEGORIES['ESSAY']['i-2']),
Field('category_mark_3', label=CATEGORIES['ESSAY']['i-3']),
Field('category_mark_4', label=CATEGORIES['ESSAY']['i-4']),
'comments',
'mark'
)
elif marksheet_type == 'PRESENTATION':
...
class Meta:
model = IndividualFeedback
fields = [
'marker',
'marking_date',
'submission_date',
'comments',
'category_mark_1',
'category_mark_2',
'category_mark_3',
'category_mark_4',
'category_mark_5',
'category_mark_6',
'category_mark_7',
'category_mark_8',
]
views.py中的代码非常直接,显然会传递正确的参数 - 如" print"线。
我怎样才能让它发挥作用?
作为第二个问题:测试目的是否足以简单地测试" assertContains"在form_as_p()中还是因为Crispy Forms而需要其他东西?
答案 0 :(得分:0)
您正在创建一个名为' helper'的变量。但不将其分配给表单实例。你需要使用self.helper = FormHelper:
def __init__(self, *args, **kwargs):
marksheet_type = kwargs.pop('marksheet_type')
super(IndividualFeedbackForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
if marksheet_type == 'ESSAY':
print('Detects marksheet') # Just for testing - and it does...
self.helper.layout = Layout(
'marker',
'marking_date',
'submission_date',
Field('category_mark_1', label=CATEGORIES['ESSAY']['i-1']),
Field('category_mark_2', label=CATEGORIES['ESSAY']['i-2']),
Field('category_mark_3', label=CATEGORIES['ESSAY']['i-3']),
Field('category_mark_4', label=CATEGORIES['ESSAY']['i-4']),
'comments',
'mark'
)
elif marksheet_type == 'PRESENTATION':
...
您还可以从顶部的类定义中删除FormHelper()。
最后,请记住,crispy表单会自动附加Meta类中未在布局中出现的任何字段。请参阅source。