Django表单字段取决于参数和Crispy表单
我正在尝试使用Django表单(使用Crispy表单呈现),其中显示的表单字段取决于从视图传递给表单的参数。我相信参数传递是正确的,但仍然显示了所有表单字段 “IndividualFeedback”模型包含可用于各种不同评估类型的字段,并有8个用于反馈类别的字段。其中显示的数量应取决于我在视图中指定的评估类型。我希望“随笔”评估类型显示其中4个类别字段,“演示”类型显示3个。目前,无论我传递什么,我都得到了8分 这是我的forms.py:Django表单字段取决于参数和Crispy表单,django,django-forms,django-crispy-forms,Django,Django Forms,Django Crispy Forms,我正在尝试使用Django表单(使用Crispy表单呈现),其中显示的表单字段取决于从视图传递给表单的参数。我相信参数传递是正确的,但仍然显示了所有表单字段 “IndividualFeedback”模型包含可用于各种不同评估类型的字段,并有8个用于反馈类别的字段。其中显示的数量应取决于我在视图中指定的评估类型。我希望“随笔”评估类型显示其中4个类别字段,“演示”类型显示3个。目前,无论我传递什么,我都得到了8分 这是我的forms.py: class IndividualFeedbackForm
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',
]
py中的代码非常直接,显然传递了正确的参数,如“print”行所示
我怎样才能让它工作
第二个问题是:对于测试目的来说,仅仅测试表单_as _p()中的“assertContains”就足够了吗?还是因为表单很脆,所以我需要其他东西?您正在创建一个名为“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 forms将自动附加在form Meta类中定义的、布局中不存在的任何字段。请参阅。这也不能完全解决问题:虽然表单现在按照计划首先呈现(四个类别后面是注释和标记),但其他四个类别显示在标记后面。我需要在“Meta”类的字段中解决这个问题吗?哦,是的,看起来你必须这样做: