django形成error_class

时间:2010-01-24 02:49:31

标签: django django-templates django-forms

有没有办法在表单定义中为表单提供特殊的错误呈现功能?在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>

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

2 个答案:

答案 0 :(得分:6)

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

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)

答案 1 :(得分:3)

尝试以下方法:

class MyForm(forms.Form):
    ...

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

应该有效。但我没有测试它。