You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django单页登录注册系统表单验证错误无法在页面显示

Django注册表单错误不显示问题解决方案

问题根源

你的视图代码存在核心逻辑漏洞:处理注册POST请求时,仅在表单验证通过时执行创建用户的逻辑,但当表单无效时,没有把带有错误信息的表单实例传入模板上下文,而是在POST分支外重新创建了一个空的CustomUserCreationForm,导致模板无法读取到错误提示。

修正后的视图代码

def login_register_view(request):
    if request.user.is_authenticated:
        return redirect('core:home')

    # 先初始化空表单,处理GET请求场景
    login_form = CustomAuthenticationForm()
    registration_form = CustomUserCreationForm()

    if request.method == 'POST':
        action = request.POST.get('action')

        if action == 'login':
             # 保留原有登录逻辑
             pass
        elif action == 'register':
            # 用POST数据初始化表单,保留错误信息
            registration_form = CustomUserCreationForm(request.POST)
            if registration_form.is_valid():
                # create_user方法已自动保存用户,无需额外调用save()
                User.objects.create_user(
                    username=registration_form.cleaned_data['username'],
                    email=registration_form.cleaned_data['email'],
                    password=registration_form.cleaned_data['password1']
                )
                return redirect('core:login_register')

    context = {
        'login_form': login_form,
        'registration_form': registration_form,
    }

    return render(request, 'accounts/login_register.html', context)

关键修改说明

  1. 把表单初始化移到POST判断外,确保GET请求时展示空表单
  2. 在注册POST分支中,始终使用带有请求数据的表单实例,无论验证是否通过,都将其传入上下文
  3. 移除冗余的user.save(),因为create_user方法已经自动完成用户保存操作

模板优化建议

默认的{{ field.errors }}会输出列表格式的错误信息,可修改为单条错误展示,提升用户体验:

<div class="form-group">
    {{ registration_form.username.label_tag }}
    {{ registration_form.username }}
    {% if registration_form.username.errors %}
    <span class="error">{{ registration_form.username.errors.0 }}</span>
    {% endif %}
</div>

可添加CSS样式美化错误提示:

.error {
    color: #dc3545;
    font-size: 0.875rem;
    margin-top: 0.25rem;
    display: block;
}

内容的提问来源于stack exchange,提问作者Kio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:02:56