覆盖Django表单的默认属性
问题内容:
在我的Django应用中,我有几种不同的形式,它们的样式相似。为了不重复一遍又一遍,我尝试重写默认的表单设置。
首先,我想为我在应用程序中使用的每种表单设置一些默认设置,并尝试将 django.forms.Form 子类 化 :
class DefaultForm(forms.Form):
error_css_class = 'alert'
error_class = DivErrorList
required_css_class = 'required'
label_suffix = ':'
auto_id = True
class TechnicalSurveyForm(DefaultForm):
location = forms.CharField(label='GPS Location')
satellite = forms.ModelChoiceField(queryset=get_satellites(), empty_label=None)
modem_sn = forms.CharField()
在我的 views.py中, 我可以简单地通过
tsurvey = TechnicalSurveyForm()
不幸的是,我在 DefaultForm 中设置的设置不存在(当我使用TechnicalSurvey(auto_id = True, error_class = DivErrorList)
它们时)。因此,我想我的方法在某种程度上是完全错误的。有人可以帮我吗?
问题答案:
我猜想窗体__init__
的forms.Form
初始化属性。__init__
在Django完成其工作之后,您需要覆盖该方法并更改属性。
编辑:
的确,在检查了Django源代码后,您可以看到表单对象的属性已在__init__
函数中初始化。该方法在django的github上可见。
class DefaultForm(forms.Form):
def __init__(self, *args, **kwargs):
super(forms.Form, self ).__init__(*args, **kwargs)
self.error_css_class = 'alert'
self.error_class = DivErrorList
self.required_css_class = 'required'
self.label_suffix = ':'
self.auto_id = True
对于Python初学者
此行为是完全正常的。如果在init函数中也定义了在类声明中声明的具有相同名称的每个属性(如作者示例中所示),则将覆盖它们。有一个轻微的区别这两种类型的属性声明之间。