使用标签而不是字段nam呈现表单错误

2024-06-28 20:34:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在模板中使用{{form.errors}列出所有表单错误。这将生成表单字段列表和每个字段的错误嵌套列表。但是,使用字段的文字名称。生成的在特定字段中有错误的html可能如下所示。

<ul class="errorlist">
    <li>
        target_date_mdcy
        <ul class="errorlist">
            <li>This field is required.</li>
        </ul>
    </li>
</ul>

我想使用错误列表功能,因为它很好和容易。但是,我想使用标签(“目标日期”,比方说)而不是字段名。实际上,我想不出一个例子,在这种情况下,你会希望显示一个网页的用户的域名。是否有方法将呈现的错误列表与字段标签一起使用?


Tags: form名称模板表单列表html错误li
3条回答

我在一个自定义表单类中解决了这个问题,我的所有表单都继承了这个类,而不是django.forms.Form。在这里,我改变了form.errors的工作方式,返回一个自定义的ErrorDict,其as_ul方法考虑了标签。因此,您不需要更改模板,但需要让表单继承CustomBaseForm

class CustomErrorDict(ErrorDict):
    def __init__(self, form, iterable=None, **kwargs):
        self.form = form
        super(CustomErrorDict, self).__init__(iterable, **kwargs)

    def as_ul(self):
        if not self:
            return u''

        def humanify(field_name):
            try:
                return self.form.fields[field_name].label or field_name
            except:
                return field_name

        # main logic is copied from the original ErrorDict:
        return mark_safe(u'<ul class="errorlist">%s</ul>'
                % ''.join([u'<li>%s%s</li>' % (humanify(k), force_unicode(v))
                    for k, v in self.items()]))

class CustomBaseForm(forms.Form):
    @property
    def errors(self):
        return CustomErrorDict(self, super(forms.Form, self).errors)

    ... rest of CustomBaseForm ...

我知道这已经得到了回答,但是,我在相同的场景中运行,发现有一种简单的方法可以使用标签:

{% if form.errors %}
    <ul class="user-msg error">
    {% for field in form %}
        {% for error in field.errors %}
            <li>
              {% if field != '__all__' %}
                <strong>{{ field.label }}:</strong>
              {% endif %}
              {{ error }}
            </li>
        {% endfor %}
    {% endfor %}
    </ul>
{% endif %}

我看不出一个简单的方法。

表单的errors属性实际上返回一个ErrorDict,一个在django.forms.utils中定义的类-它是dict的一个子类,知道如何将自己的ul呈现为其unicode表示。但键实际上是字段名,这对于其他行为的维护很重要。因此,它无法轻松访问字段标签。

您可以定义一个接受表单的自定义模板标记来生成您喜欢的呈现,因为在Python代码中,很容易获得给定表单和字段名的字段标签。或者可以在视图中按标签构造一个错误列表,将其添加到上下文中,然后改用它。

编辑 另外,您还可以遍历字段并检查它们各自的错误,同时记住显示non_field_errors。类似于:

<ul class="errorlist">
  {% if form.non_field_errors %}
    <li>{{ form.non_field_errors }}</li>
  {% endif %}
  {% for field in form %}
    {% if field.errors %}
      <li>
        {{ field.label }}
        <ul class="errorlist">
          {% for error in field.errors %}
            <li>{{ error }}</li>
          {% endfor %}
        </ul>
      </li>
    {% endif %}
  {% endfor %}
</ul>

您可能还需要将非字段错误包装到列表中,具体取决于。

相关问题 更多 >