Django根据Crispy Forms的参数表单字段

时间:2014-10-25 13:22:37

标签: django django-forms django-crispy-forms

我正在尝试使用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而需要其他东西?

1 个答案:

答案 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':
            ...

参见示例http://django-crispy-forms.readthedocs.org/en/latest/form_helper.html#formhelper-with-a-form-attached-default-layout

您还可以从顶部的类定义中删除FormHelper()。

最后,请记住,crispy表单会自动附加Meta类中未在布局中出现的任何字段。请参阅source