覆盖Django表单的默认属性

neu*_*oph 3 python django django-forms

在我的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()
Run Code Online (Sandbox Code Playgroud)

在我的views.py中,我会简单地使用表单

tsurvey = TechnicalSurveyForm()
Run Code Online (Sandbox Code Playgroud)

不幸的是,我在DefaultForm中设置的设置不到位(当我使用TechnicalSurvey(auto_id = True, error_class = DivErrorList)它们时).所以,我想我的方法在某种程度上是完全错误的.有人可以帮帮我吗?

Max*_*ant 6

我猜__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
Run Code Online (Sandbox Code Playgroud)

对于Python初学者

这种行为完全正常.如果在init函数中也定义了在类声明中声明的每个具有相同名称的属性(如在作者示例中),则将覆盖它们.有一个轻微的区别这两种类型的属性声明之间.