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

Django自定义注册表单验证失败无错误提示问题求助

问题排查与修复方案

核心错误原因

所有错误提示丢失的问题都源于视图函数中,表单验证不通过时你直接销毁了携带错误信息的原表单对象,重新返回了空白表单。

1. 视图函数修复

你的视图存在以下错误:

  • 表单is_valid()返回False时,重新实例化了空白的SignUpForm,丢失了原表单的错误信息和用户已填内容
  • 重复执行is_valid()判断,冗余添加了密码一致性、邮箱唯一性校验逻辑:UserCreationForm本身已经内置密码一致性校验,不需要额外判断
  • 邮箱存在性判断逻辑写反:当前逻辑为邮箱不存在时直接返回空白表单,和注册需求完全相反
  • GET请求分支引用了未定义的form变量,会触发服务端报错

修复后的视图代码如下:

@csrf_exempt
def signup1(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        # 验证不通过直接返回带错误的原表单,不要重新实例化
        if not form.is_valid():
            return render(request, 'accounts/register.html', {'form': form})
        
        # 验证通过后取字段值
        email = form.cleaned_data["email"]
        username = form.cleaned_data["username"]
        p1 = form.cleaned_data["password1"]

        # 修正邮箱存在性判断逻辑:邮箱已存在才返回错误
        if User.objects.filter(email__exact=email).exists():
            form.add_error('email', '该邮箱已被注册')
            return render(request, 'accounts/register.html', {'form': form})

        # 创建用户
        user = User.objects.create_user(
            email=email, username=username, password=p1
        )
        user.save()
        pro = Profile(user_id=user.id, isVerified=False)
        pro.save()

        sender = 'xilplatform@gmail.com'
        receiver = [email]
        message = "Welcome to XIL Platform "+receiver[0] + \
            " Please Verify you account by clicking \n the link in the email  we sent you! \n" \
            "If you registerd in heroku use this link to verify - https://django.herokuapp.com//verifyAccount?email="+receiver[0] + \
            "\n If you are using localhost use this link to verify - http://localhost:8000/verifyAccount?email=" + \
            receiver[0]
        
        try:
            with smtplib.SMTP(smtp_server, port) as server:
                server.starttls()
                server.login(loginAddr, password)
                server.sendmail(sender, receiver, message)
            return redirect('/')
        except (gaierror, ConnectionRefusedError):
            print('Failed to connect to the server. Bad connection settings?')
        except smtplib.SMTPServerDisconnected:
            print('Failed to connect to the server. Wrong user/password?')
        except smtplib.SMTPException as e:
            print('SMTP error occurred: ' + str(e))
        return redirect('/')
    else:
        # GET请求实例化空白表单返回
        form = SignUpForm()
        return render(request, 'accounts/register.html', {'form': form})

2. 模板代码修复

你的模板中嵌套了两层<form>标签,不符合HTML规范,需要删掉多余的嵌套层,修复后的核心代码如下:

<form action="/signup" method="post">
  {% csrf_token %}
  {% for field in form %}
  <p>
    {{ field.label_tag }}<br>
    {{ field }}
    {% if field.help_text %}
    <small style="color: grey">{{ field.help_text | safe }}</small>
    {% endif %}
    {% for error in field.errors %}
    <p style="color: red">{{ error | safe }}</p>
    {% endfor %}
  </p>
  {% endfor %}
  <div class="card-footer">
    <button type="submit" class="btn btn-primary">Register</button>
    &nbsp; &nbsp;
    Have an account? <a href="{% url 'login' %}" class="text-primary">Login</a>
  </div>
</form>

可选优化

你可以直接在SignUpForm中添加邮箱唯一性校验,不需要在视图中单独判断,错误信息会自动渲染到邮箱字段的错误位置:修改form.py中的email字段定义,添加unique=True参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:09:03