2010-01-24 74 views
4

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

所以,你可以定义一些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> 

但我不希望名字每次我实例化一个表单时的错误类,有没有办法在窗体定义中定义自定义错误渲染器?

回答

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) 
3

尝试以下操作:

class MyForm(forms.Form): 
    ... 

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

应该工作。但我没有测试它。

+0

没有对我的工作 – 2011-06-13 10:43:53