如何在我的 Django 模板中制作自定义表单错误部分?

How do I make a custom form errors section in my Django template?

在我的 Django 模板中,我可以使用这种语法 {{ form.errors }} 来显示错误。 但这在我的模板中评估为这个 html 语法:

<ul class="errorlist">
   <li>password
      <ul class="errorlist">
         <li>Ensure this value has at least 10 characters (it has 2).</li>
      </ul>
   </li>
   <li>confirm_password
      <ul class="errorlist">
         <li>Ensure this value has at least 10 characters (it has 2).</li>
      </ul>
   </li>
   <li>first_name
      <ul class="errorlist">
         <li>Ensure this value has at least 2 characters (it has 1).</li>
      </ul>
   </li>
   <li>last_name
      <ul class="errorlist">
         <li>Ensure this value has at least 2 characters (it has 1).</li>
      </ul>
   </li>
</ul>

这不是我想要的 html 语法。我实际上想将它们包装在我自己的元素中。 例如

{%if form.errors %}
   <section class="errors-container">
      {% for err in form.errors %}
         <p>{{err.field_name}}</p>
         <div>
            {{err.actual_error_for_field_name}}
         </div>
      {% endfor %}
   </section>
{%endif%}

这就是我想要的布局。 在我看来,我什至尝试将错误变量传递给上下文字典。

def user_register(request):
    errors = {}
    if request.method == 'POST':
        form = PersonRegisterForm(request.POST)
        if form.is_valid():
            if form.cleaned_data['password'] == form.cleaned_data['confirm_password']:
                cd = form.cleaned_data
                new_user = Person.objects.create_user(username=cd['username'], email=cd['email'],
                                                      password=cd['password'],
                                                      first_name=cd['first_name'], last_name=cd['last_name'])
                messages.success(request, f'You are successfully registered as {new_user.username}!')
                return redirect("profile", new_user.id)
        for i in form.errors:
            errors[i] = form.errors[i]
        print(errors)
    else:
        form = PersonRegisterForm()
    context = {
        'form': form,
        'title': 'Register',
        'errors': errors
    }
    return render(request, 'index/register.html', context)

但这并不是很有效,因为我无法使用 Jinja2 语法遍历模板中的 errors 字典,因为 {% for a, b in errors.items() %} 会给我这个错误

Could not parse the remainder: '()' from 'errors.items()'

你很接近,当某些东西可调用时,Django 会自动调用它。所以你可以遍历错误:

{% if form.errors %}
    <section class="errors-container">
    {% for <b>f, es</b> in form.errors<b>.items</b> %}
        {% for <b>e in es</b> %}
             <p>{{ f }}</p>
             <div>
                {{ e }}
             </div>
        {% endfor %}
    {% endfor %}
    </section>
{% endif %}

{% for e in es %} 是必需的,因为错误将字段名映射到错误的 列表 上,因此我们需要遍历列表以遍历 个人个错误。