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> Have an account? <a href="{% url 'login' %}" class="text-primary">Login</a> </div> </form>
可选优化
你可以直接在SignUpForm中添加邮箱唯一性校验,不需要在视图中单独判断,错误信息会自动渲染到邮箱字段的错误位置:修改form.py中的email字段定义,添加unique=True参数即可。
内容的提问来源于stack exchange,提问作者yonatan hornstein
相关产品推荐
相关产品推荐

