Django form.errors 未显示在模板中

Posted

技术标签:

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

我已引用this *** 页面并尝试在 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 %

正如 *** 问题中所说,我也尝试过简单地做:

% 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;

【问题讨论】:

【参考方案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 时创建一个空表单

以上是关于Django form.errors 未显示在模板中的主要内容,如果未能解决你的问题,请参考以下文章

我的 Django ModelForm 是未绑定的吗?

更改 django 在显示表单错误消息时使用的字段名称

django如何访问错误消息列表中的第一个错误

django:打印表单错误时如何删除项目符号

Django,遍历所有表单错误

Django 将自定义表单错误添加到 form.errors