Django form.errors未显示在模板中

时间:2018-07-03 03:06:53

标签: python django forms jinja2

我已刷新this stackoverflow页面,并尝试在html模板上显示我的表单错误。 我做到了:

    {% if form.error %}
    {% for field in form %}
        {% for error in field.errors %}
            <div class="alert alert-danger">
                <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}

如stackoverflow问题中所述,我也尝试简单地这样做:

{% if form.error %}
This should pop up if there is an error
{% endif %}

无论如何,什么都没有发生: 这是我的view.py代码:

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password2')
            user = authenticate(username=username, password=password)
            login(request, user)
            return HttpResponseRedirect('/')
        else:
            print(form.errors)
    form = UserCreationForm()
    return render(request, 'registration/register.html', {'form': form})

我能够将表单错误显示在django控制台上,但它拒绝显示在模板上。

打印form.errors将打印到控制台:<li>password2<ul class="errorlist"><li>The two password fields didn&#39;t match.</li></ul></li></ul>

1 个答案:

答案 0 :(得分:4)

forms.errors被触发,但是最后,您在呈现视图之前声明了一个新表单form = UserCreationForm()

在检查form是否有效之后,您所有的验证错误都位于form实例中,请记住进程按顺序运行,最后销毁变量formform = UserCreationForm(),因此不再有验证错误

您可以做的是,当您的请求方法为form = UserCreationForm() 时,将此新表单GET添加到else语句中,以保持表单为空。通过添加else语句,您可以避免表单的新分配;验证过程后,它将跳至render(request,....)实例,其中包含所有验证错误

form
  

请注意,模板中对格式错误的正确调用是if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): form.save() username = form.cleaned_data.get('username') password = form.cleaned_data.get('password2') user = authenticate(username=username, password=password) login(request, user) return HttpResponseRedirect('/') else: print(form.errors) else: form = UserCreationForm() return render(request, 'registration/register.html', {'form': form}) ,其中 s 不是form.errors

form.error