【问题标题】:How to render Django form errors not in a UL?如何在 UL 中呈现 Django 表单错误?
【发布时间】:2011-11-17 04:27:16
【问题描述】:

根据docs...,我的 Django 表单中的错误正在 UL 中呈现...

姜戈

{{ form.non_field_errors }}

HTML

<ul class="errorlist">
  <li>Sender is required.</li>
</ul>

如何呈现错误,使它们不出现在 UL 中,而是出现在每个字段相关错误的段落标签中?所以理想...

<ul>
  <li>
    <label>...</label>
    <input>...</input>
    <p>Error message...</p>
  </li>
</ul>

编辑:

为了清楚起见,我应该在示例中使用此代码...

{{ form.fieldname.errors }}

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可以在模板中显示如下错误:

    <p>{{ form.fieldname.errors.as_text }}</p>
    

    【讨论】:

    • 感谢您的提示。但是我认为您的代码适用于单个字段,如果我使用生成的 form.as_p 怎么办?所以我不能放在每个字段上
    【解决方案2】:

    它显然不能在字段的上下文中呈现,因为正如属性名称所暗示的那样,这些是“非字段错误”。解决此问题的唯一方法是在验证时将错误添加到正确的位置。例如,执行以下操作会导致非字段错误:

    class MyModelForm(forms.ModelForm):
        class Meta:
            model = MyModel
    
        def clean(self):
            somefield = self.cleaned_data.get('somefield')
            if not somefield:
                raise forms.ValidationError('Some field is blank')
    

    但是,您可以执行以下操作以使该错误仍显示在右侧字段中:

    class MyModelForm(forms.ModelForm):
        class Meta:
            model = MyModel
    
        def clean(self):
            somefield = self.cleaned_data.get('somefield')
            if not somefield:
                if not self._errors.has_key('somefield'):
                    from django.forms.util import ErrorList
                    self._errors['somefield'] = ErrorList()
                self._errors['somefield'].append('Some field is blank')
    

    更新:

    来自 Django docs

    每个命名的表单域都可以使用 {{ 输出到模板 form.name_of_field }},它将生成显示所需的 HTML 表单小部件。使用 {{ form.name_of_field.errors }} 显示一个列表 表单错误,呈现为无序列表。这可能看起来像:

    <ul class="errorlist">
        <li>Sender is required.</li>
    </ul>
    

    该列表有一个错误列表的 CSS 类,允许您为其设置样式 外貌。 如果您希望进一步自定义错误的显示,您可以 可以通过遍历它们来做到这一点(强调我的)

    {% if form.subject.errors %}
        <ol>
        {% for error in form.subject.errors %}
            <li><strong>{{ error|escape }}</strong></li>
        {% endfor %}
        </ol>
    {% endif %}
    

    【讨论】:

    • 抱歉,我不清楚,如果我处理 '{{ form.fieldname.errors }}',它仍然会将错误消息转储到 UL 中。我已经编辑了我的问题以反映这一点。
    猜你喜欢
    • 2013-05-07
    • 2018-08-31
    • 2011-09-16
    • 2020-03-13
    • 2016-03-09
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多