【问题标题】:Django form.errors not showing up in templateDjango form.errors 未显示在模板中
【发布时间】:2018-12-11 06:27:00
【问题描述】:

我已引用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 打印到控制台:&lt;li&gt;password2&lt;ul class="errorlist"&gt;&lt;li&gt;The two password fields didn&amp;#39;t match.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;

【问题讨论】:

    标签: python django forms jinja2


    【解决方案1】:

    forms.errors 启动了,但最后,您在渲染视图之前声明了一个新表单 form = UserCreationForm()

    在检查form 是否有效后,你所有的验证错误都在form 实例中,记住进程按顺序运行,最后,你销毁变量form使用form = UserCreationForm() 所以不再有验证错误

    当您的请求方法为 GET 时,您可以将这个新表单 form = UserCreationForm() 添加到 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})
    

    注意,模板中form errors的正确调用是form.errorss不是form.error

    <s>{% if form.error %}</s>  <b>{% if form.errors %}</b>

    【讨论】:

    • 我应该为 post 和 get 请求创建 1 个表单吗?
    • 通常是的,但还有很多其他方法。当请求为 POST 时,您创建一个带有 request.POST 的表单,当它是 GET 时创建一个空表单
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2015-11-09
    • 2013-06-23
    • 2022-01-03
    • 2012-05-24
    • 2021-12-10
    相关资源
    最近更新 更多