【问题标题】:Override defaults attributes of a Django form覆盖 Django 表单的默认属性
【发布时间】:2013-08-03 22:06:06
【问题描述】:

在我的 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) 时它们是)。所以,我想我的方法在某种程度上是完全错误的。有人可以帮帮我吗?

【问题讨论】:

  • 使用 Django 1.7,看起来上面的 确实 可以工作(至少 required_css_class 可以)。

标签: python django django-forms


【解决方案1】:

我猜forms.Form 的__init__ 初始化了表单的属性。在 Django 完成它的工作后,您需要覆盖 __init__ 方法并更改属性。

编辑:确实,在查看 django 源代码后,您可以看到表单对象的属性在 __init__ 函数中进行了初始化。 The method is visible on the github of django。

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 函数中也定义了在类声明中声明的每个具有相同名称的属性(如作者示例中所示),它将被覆盖。这两种属性声明之间有一个slightly difference。

【讨论】:

  • 很好的答案,谢谢你,马克西姆!也感谢您提示来源!
猜你喜欢
  • 1970-01-01
  • 2014-01-05
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多