我也可以创建不同类型的表单,但这很乏味。 那么是否可以将类型传递给表单,然后相应地显示表单? 此代码显示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,
]
是否可以像这样将参数传递给元类?
表单是一个类,当它在 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
从基于类的视图发送值。仅供参考:您无需在元类中更改任何内容。
更新:
从注释中的讨论来看,OP 应该使用forms.Form
而不是ModelForm
因为使用模型形式需要类Meta
字段/exclude 值。