将参数传递给Django元类

时间:2019-11-25 05:53:36

标签: python django

我可以选择创建其他类型的表单,但这很乏味。 那么有可能将类型传递给表单,然后相应地显示表单吗? 此代码显示NameError: name 'review_type' is not defined

class Contest1_for_review(ModelForm, review_type):

    class Meta:

        model = Contest1

        decision = review_type + '_decision'
        comment = review_type +'comment'

        fields = [
            decision,
            comment,
        ]

是否可以像这样将参数传递给元类?

1 个答案:

答案 0 :(得分:0)

Form是一个类,当它在HTML中呈现时,它呈现表单类的实例。因此,在将值传递给该实例时,可以使用其__init__方法。例如:

class Contest1_for_review(ModelForm):

    def __init__(self, *args, **kwargs):
        review_type = kwargs.pop('review_type')  # <-- getting the value from keyword arguments
        super().__init__(*args, **kwargs)
        self.fields[f'{review_type}_decision'] = forms.CharField()
        self.fields[f'{review_type}_comment'] = forms.CharField()

    class Meta:
        model = Contest1
        fields = "__all__"

此外,您还需要将review_type的值从视图发送到表单。在基于函数的视图中如下所示:

form = Contest1_for_review(review_type="my_value")

或使用get_form_kwargs从基于类的视图发送值。仅供参考:您无需在 Meta 类中进行任何更改。


更新:

在评论讨论中,OP应该使用forms.Form而不是ModelForm,因为使用模型形式需要Meta类中的字段/ exclude值。