如何更改Django显示验证期间创建的错误消息的方式?

时间:2009-08-18 14:28:47

标签: django validation

我喜欢Django执行表单验证的方式。但是,我想覆盖错误显示的方式。我想将表单验证错误发送到我的网页顶部(到特定的div标签),而不是让Django在无效的表单字段旁边显示错误。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

您只需在模板顶部指定{{ form.errors }}即可轻松完成此操作,而不是将{{ field.errors }}放在每个字段级别。

我怀疑你的问题是,你只是使用{{ form.as_p }}标签或其中一个兄弟,一次输​​出整个表格。如果要根据需要自定义显示,请不要这样做。用一个简单的for循环替换它来通过每个字段并显示它的label_tag和字段本身并不是很困难,并且你从增加的控制中获益匪浅。

答案 1 :(得分:0)

丹尼尔向你指出了正确的方向。请参阅此处的文档:

http://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template

“可以使用{{form.name-of-field}}将每个命名的表单字段输出到模板,这将生成显示表单窗口小部件所需的HTML。使用{{form.name-of-field .errors}}显示字段错误列表....“

答案 2 :(得分:0)

我建议你覆盖表单的as_XXX方法,在我的情况下,我重写as_p:

def html_output(self, normal_row, help_text_html):
    "Helper function for outputting HTML"
    output = []

    for name, field in self.fields.items():
        html_class_attr = ''
        bf = BoundField(self, field, name)
        if bf.is_hidden:
            hidden_fields.append(unicode(bf))
        else:
            css_classes = bf.css_classes()
            if css_classes:
                html_class_attr = ' class="%s"' % css_classes

            if bf.label:
                label = conditional_escape(force_unicode(bf.label))
                if self.label_suffix:
                    if label[-1] not in ':?.!':
                        label += self.label_suffix
                label = bf.label_tag(label) or ''
            else:
                label = ''

            if field.help_text:
                help_text = help_text_html % force_unicode(field.help_text)
            else:
                help_text = u''

            output.append(normal_row % {
                'label': force_unicode(label),
                'field': unicode(bf),
                'help_text': help_text,
                'html_class_attr': html_class_attr
            })
    return mark_safe(u'\n'.join(output))

def as_p(self):
    "Returns this form rendered as HTML <p>s."
    return self.html_output(
        normal_row = u'<p%(html_class_attr)s>%(label)s %(field)s%(help_text)s</p>',
        help_text_html = u' <span class="helptext">%s</span>')

虽然有点难看。希望它有所帮助。