2010-01-24 70 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