我可以选择创建其他类型的表单,但这很乏味。
那么有可能将类型传递给表单,然后相应地显示表单吗?
此代码显示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,
]
是否可以像这样将参数传递给元类?
答案 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值。