如何在我的 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 %}
是必需的,因为错误将字段名映射到错误的 列表 上,因此我们需要遍历列表以遍历 个人个错误。
在我的 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 %}
是必需的,因为错误将字段名映射到错误的 列表 上,因此我们需要遍历列表以遍历 个人个错误。