鱼C论坛

 找回密码
 立即注册
查看: 2968|回复: 8

[已解决]python 搭建用户注册界面 匹配失败

[复制链接]
发表于 2023-5-19 15:21:39 | 显示全部楼层    本楼为最佳答案   
tengke 发表于 2023-5-20 18:06
按照你提供的代码  进行配置
两次密码 一致可以正常插入数据库
不一致web界面没有错误提示 只能清除两 ...

抱歉,我忘记提到 Django 错误消息的显示方式。

当你在表单验证中引发一个  ValidationError  时,错误消息会被添加到  form.errors  字典中。你需要在模板中显示这些错误消息。一个简单的方式就是在模板中使用  {{ form.errors }} ,这将打印出所有的表单错误。

然而,为了提供更好的用户体验,你可能想在特定的字段下面显示相关的错误消息。以下是一种在模板中显示特定字段错误的方式:

  1. <form method="post">
  2.     {% csrf_token %}
  3.     {{ form.username.label_tag }} {{ form.username }}
  4.     {{ form.password.label_tag }} {{ form.password }}
  5.     {{ form.passwords.label_tag }} {{ form.passwords }}
  6.     {% if form.errors %}
  7.         <ul>
  8.             {% for field in form %}
  9.                 {% for error in field.errors %}
  10.                     <li><strong>{{ field.label }}</strong>: {{ error|escape }}</li>
  11.                 {% endfor %}
  12.             {% endfor %}
  13.             {% for error in form.non_field_errors %}
  14.                 <li><strong>非字段错误</strong>: {{ error|escape }}</li>
  15.             {% endfor %}
  16.         </ul>
  17.     {% endif %}
  18.     <button type="submit">注册</button>
  19. </form>
复制代码


在上述模板中,我们先列出了每个字段的标签和字段自身,然后检查  form.errors ,如果有错误,我们就为每个字段的每个错误和非字段错误创建一个列表项。

注意, form.non_field_errors  用于显示那些不特定于单个字段的错误,这正好适用于你在  clean  方法中引发的  ValidationError 。

希望这能帮助你解决问题!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-19 16:13:48 | 显示全部楼层
从你的代码来看,你定义了一个  a_user  表单用于处理用户注册,其中包括了 "username", "password", 和 "passwords" 字段。同时你在  a_user  表单中也定义了一个  yz  方法用于验证两次密码是否一致。你的  adminuseradd  视图也处理了 GET 和 POST 请求,对表单的有效性进行检查。

然而,根据 Django 的  ModelForm  表单验证流程,你定义的  yz  方法并没有在验证过程中被调用。因为  ModelForm  的验证流程只会自动调用  clean_<fieldname>  方法,其中  <fieldname>  是你想要对应的字段名。如果你想在验证过程中包含自定义的验证,你应该使用  clean  或者  clean_<fieldname>  方法。

以下是你的代码修改后的样子:

  1. class a_user(forms.ModelForm):
  2.     passwords = forms.CharField(
  3.         label="确认密码",
  4.         widget=forms.PasswordInput
  5.     )

  6.     class Meta:
  7.         model = models.admin
  8.         fields = ["username","password","passwords"]
  9.         widgets = {"password":forms.PasswordInput}
  10.         
  11.     def clean(self):
  12.         cleaned_data = super().clean()
  13.         pwd = cleaned_data.get("password")
  14.         pwds = cleaned_data.get("passwords")
  15.         if pwds != pwd:
  16.             raise forms.ValidationError("密码不一致")
  17.         return cleaned_data


  18. def adminuseradd(request):
  19.     if request.method == "GET":
  20.         form = a_user()
  21.         return render(request, "adminuseradd.html", {"form": form})

  22.     form = a_user(data=request.POST)
  23.     if form.is_valid():
  24.         form.save()
  25.         return redirect('/adminview')
  26.     else:
  27.         return render(request, "adminuseradd.html", {"form": form})
复制代码


在上述代码中,我将  yz  方法改名为  clean 。当表单调用  is_valid()  方法时,Django 会自动调用这个  clean  方法进行验证。如果  pwds  和  pwd  不一致,它将引发一个  ValidationError ,并附上错误消息 "密码不一致"。这样,在你的视图函数中,如果  form.is_valid()  返回  False ,这个错误消息将会被添加到表单的错误中,你就可以在模板中显示出来。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-20 20:17:37 | 显示全部楼层
tengke 发表于 2023-5-20 20:11
多谢大佬   一下是我修改之后的数据
——————————————————————————————— ...

你的修改看起来不错,应该能够在表单验证失败时正确显示错误消息。

注意,你的 HTML 模板中,密码不匹配的错误(是一个非字段错误)应该会在  {% for error in form.non_field_errors %}  循环中被显示出来。

如果你想要让错误消息有更好的可视化效果,比如更醒目的颜色或者样式,你可以用 CSS 来增强它们的样式。例如,你可以把错误消息放在一个带有红色字体的  div  标签内,像这样:

  1. {% for error in form.non_field_errors %}
  2.     <div style="color: red;">{{ error|escape }}</div>
  3. {% endfor %}
复制代码


或者,如果你使用 Bootstrap 或其他 CSS 框架,你可以利用框架的预定义样式,如下:

  1. {% for error in form.non_field_errors %}
  2.     <div class="alert alert-danger">{{ error|escape }}</div>
  3. {% endfor %}
复制代码


请试试看,看看这些改变是否能满足你的需求。如果还有其他问题,欢迎继续提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-4 08:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表