django формы error_class - PullRequest
       6

django формы error_class

4 голосов
/ 24 января 2010

Есть ли способ придать форме специальную функцию отрисовки ошибок в определении формы? В документации по 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 ]

6 голосов
/ 12 апреля 2010

Если вы хотите, чтобы это поведение было общим для всех ваших форм, вы можете задать свой собственный базовый класс форм, подобный этому:

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's:

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 голосов
/ 26 января 2010

Попробуйте следующее:

class MyForm(forms.Form):
    ...

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

Должно работать. Но я не проверял это.

...