【问题标题】:django forms error_classdjango 表单 error_class
【发布时间】:2011-01-08 16:52:45
【问题描述】:

有没有办法在表单定义中给表单一个特殊的错误渲染函数?在customizing-the-error-list-format 下的文档中,它展示了如何为表单提供特殊的错误呈现函数,但似乎您必须在实例化表单时声明它,而不是在定义它时。

所以你可以定义一些 ErrorList 类,比如:

from django.forms.util import ErrorList
 class DivErrorList(ErrorList):
     def __unicode__(self):
         return self.as_divs()
     def as_divs(self):
         if not self: return u''
         return u'<div class="errorlist">%s</div>' % ''.join([u'<div class="error">%s</div>' % e for e in self])

然后当你实例化你的表单时,你可以用那个 error_class 实例化它:

 f = ContactForm(data, auto_id=False, error_class=DivErrorList)
 f.as_p()

<div class="errorlist"><div class="error">This field is required.</div></div>
<p>Subject: <input type="text" name="subject" maxlength="100" /></p>
<p>Message: <input type="text" name="message" value="Hi there" /></p>
<div class="errorlist"><div class="error">Enter a valid e-mail address.</div></div>
<p>Sender: <input type="text" name="sender" value="invalid e-mail address" /></p>
<p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p>

但我不想每次实例化表单时都命名错误类,有没有办法只在表单定义中定义自定义错误渲染器?

【问题讨论】:

    标签: django django-templates django-forms


    【解决方案1】:

    如果您希望这种行为对所有表单都通用,您可以像这样定义自己的表单基类:

    class MyBaseForm(forms.Form):
        def __init__(self, *args, **kwargs):
            kwargs_new = {'error_class': DivErrorList}
            kwargs_new.update(kwargs)
            super(MyBaseForm, self).__init__(self, *args, **kwargs_new)
    

    然后让你的所有表单子类化那个。然后,您的所有表单都将DivErrorList 作为默认错误渲染器,您仍然可以使用error_class 参数对其进行更改。

    对于 ModelForm 的:

    class MyBaseModelForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            kwargs_new = {'error_class': DivErrorList}
            kwargs_new.update(kwargs)
            super(MyBaseModelForm, self).__init__(*args, **kwargs_new)
    

    【讨论】:

      【解决方案2】:

      尝试以下方法:

      class MyForm(forms.Form):
          ...
      
          def __init__(self, *args, **kwargs):
              super(MyForm, self).__init__(*args, **kwargs)
              self.error_class = DivErrorList
      

      应该可以。但我没有测试它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 2015-02-24
        • 2017-01-02
        相关资源
        最近更新 更多