Django表单字段取决于参数和Crispy表单

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

我正在尝试使用Django表单(使用Crispy表单呈现),其中显示的表单字段取决于从视图传递给表单的参数。我相信参数传递是正确的,但仍然显示了所有表单字段

“IndividualFeedback”模型包含可用于各种不同评估类型的字段,并有8个用于反馈类别的字段。其中显示的数量应取决于我在视图中指定的评估类型。我希望“随笔”评估类型显示其中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',
        ]
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”类的字段中解决这个问题吗?哦,是的,看起来你必须这样做: