tengke 发表于 2023-5-20 18:57:27

验证密码是否一致 web界面不显示错误信息

本帖最后由 tengke 于 2023-5-20 19:10 编辑

from django.core.exceptions import ValidationError
class a_user(forms.ModelForm):
    passwords= forms.CharField(
      label="确认密码",
      widget=forms.PasswordInput
    )
    class Meta:
      model = models.admin
      fields = ["username","password","passwords"]
      widgets = {"password":forms.PasswordInput}
    def clean(self):
      cleaned_data = super().clean()
      pwd = cleaned_data.get("password")
      pwds = cleaned_data.get("passwords")
      print(pwd , pwds)
      if pwds != pwd:
            raise ValidationError("byz")
      else:
            return cleaned_data
def adminuseradd(request):
    if request.method == "GET":
      form = a_user()
      print(form)
      return render(request, "adminuseradd.html", {"form": form})
    form = a_user(data=request.POST)
    if form.is_valid():
      form.save()
      return redirect('/adminview')
    else:
      return render(request, "adminuseradd.html", {"form": form})
___________
这个是html界面信息
{% extends 'rootyongh.html' %}
{% block b %}
<body>
    <form method="post" novalidate>
      {% csrf_token %}
   {% for form in form %}
       <div class="form-group">
       {{ form.label }} : {{ form }}
       <span style="color: red:"> {{ form.errors }}</span>
         </div>
   {% endfor %}
{#    <input type="submit" value="提交">#}
    <button type="submit" class="btn btn-primary">提 交</button>
    <input type="reset" name="reset" id="reset" value="重置">

      </form>
    </body>
{% endblock %}





——————————————————————
密码之前是可以正常提交的

密码不一致 数据不能输入后台数据前台也没有    raise ValidationError("byz")这显示信息




sfqxx 发表于 2023-5-20 18:57:28

根据提供的代码和信息,首先需要确认两个问题:

1.密码是否验证成功,如果密码验证未通过,则会导致表单数据无法提交到后台。
2.前端页面是否正确显示验证错误信息。

将 `adminuseradd` 函数中的 `print(form)` 行注释以避免在控制台输出对象并重新测试。

为了确保密码验证成功,请检查形式错误是否引发ValidationError,并更新 `adminuseradd` 中的else分支如下所示:


form = a_user(data=request.POST)
if form.is_valid():
    form.save()
    return redirect('/adminview')
else:
    print(form.errors) # 输出表单验证错误。
    return render(request, "adminuseradd.html", {"form": form})
这将从表单打印出验证错误消息(如果存在),以便更好地排除密码验证中的问题。

为了确保前端页面正确显示带有错误信息的表单,请使用以下内容替换html文件中for循环代码块中的错误span标记:


<span style="color: red;">{% for error in form.passwords.errors %}{{ error }}{% endfor %}</span>

这将显示特定于`passwords`字段的任何验证错误消息。

请重新测试代码并确保已解决密码验证和表单错误消息问题。

isdkz 发表于 2023-5-20 20:10:26

你的代码基本上是对的,不过有几个地方可能需要修改一下:

1.ValidationError应该绑定到特定的字段,而不是整个表单。你应该使用add_error方法添加错误。这样错误信息就可以正确地显示在表单的errors属性中。

2. 在你的 HTML 文件中,你使用了{% for form in form %} ,这可能会造成错误。这里的两个 "form" 都引用同一个对象,可能会产生混淆。你可能想把迭代变量改为其他的名字,比如 "field"。

3. 在HTML代码中, <span style="color: red:"> 这个地方多了一个冒号,应该是 <span style="color: red;">

你可以试试以下的修改:

Python代码:

def clean(self):
    cleaned_data = super().clean()
    pwd = cleaned_data.get("password")
    pwds = cleaned_data.get("passwords")
    print(pwd , pwds)
    if pwds != pwd:
      self.add_error('passwords', "两次输入的密码不一致")# 添加到特定字段的错误
    return cleaned_data


HTML代码:

{% extends 'rootyongh.html' %}
{% block b %}
<body>
    <form method="post" novalidate>
      {% csrf_token %}
   {% for field in form %}
       <div class="form-group">
       {{ field.label }} : {{ field }}
       <span style="color: red;"> {{ field.errors }}</span>
         </div>
   {% endfor %}
{#    <input type="submit" value="提交">#}
    <button type="submit" class="btn btn-primary">提 交</button>
    <input type="reset" name="reset" id="reset" value="重置">

      </form>
    </body>
{% endblock %}


希望这能帮到你!

陶远航 发表于 2023-5-20 21:11:15

根据给出的代码,我发现可能有两个问题:

确认两次输入密码一致的验证逻辑不应该放在 clean() 方法中,而是应该放在 clean_passwords() 方法中。这样可以确保只针对密码字段进行验证。

在模板中的 for 循环语句中,form 并不是一个列表(即可迭代对象),而是表单类实例化后得到的一个具体表单对象。所以将 {% for form in form %} 改为 {% for field in form %},然后在表单字段上调用相应的属性和方法。例如,{{ field.label_tag }} 和 {{ field }} 可以分别显示表单字段的标签和部件,{{ field.errors }} 显示表单字段的错误信息。

修改后的代码如下:

from django import forms
from django.core.exceptions import ValidationError
from . import models

class AdminUserForm(forms.ModelForm):
    password_confirmation = forms.CharField(
      label="确认密码",
      widget=forms.PasswordInput(),
    )

    class Meta:
      model = models.Admin
      fields = ["username", "password"]
      widgets = {"password": forms.PasswordInput(),}

    def clean_password_confirmation(self):
      password = self.cleaned_data.get("password")
      password_confirmation = self.cleaned_data.get("password_confirmation")
      if password and password_confirmation and password != password_confirmation:
            raise ValidationError("两次输入的密码不一致")
      return password_confirmation

def admin_user_add(request):
    if request.method == "GET":
      form = AdminUserForm()
      return render(request, "admin_user_add.html", {"form": form})
    form = AdminUserForm(data=request.POST)
    if form.is_valid():
      form.save()
      return redirect('/admin_view/')
    else:
      return render(request, "admin_user_add.html", {"form": form})
模板文件也需要对应地修改为:


{% extends 'root_yongh.html' %}
{% block b %}
<body>
    <form method="post" novalidate>
      {% csrf_token %}
      {% for field in form %}
            <div class="form-group">
                {{ field.label_tag }} : {{ field }}
                <span style="color: red">{{ field.errors }}</span>
            </div>
      {% endfor %}
      <button type="submit" class="btn btn-primary">提交</button>
      <input type="reset" name="reset" id="reset" value="重置">
    </form>
</body>
{% endblock %}
在这个修改后的代码中,clean_password_confirmation() 方法专门负责验证两次输入的密码是否一致,并抛出 ValidationError 异常,然后在 AdminUserForm 类的 Meta 类中只设置了 "username" 和 "password" 两个字段,这样在视图函数中获取的表单数据就只包括这两个字段。同时,模板中的 for 循环语句中使用了 field 替换了原来的 form 对象名。

希望能对你有所帮助!
页: [1]
查看完整版本: 验证密码是否一致 web界面不显示错误信息