鱼C论坛

 找回密码
 立即注册
查看: 1918|回复: 3

[已解决]验证密码是否一致 web界面不显示错误信息

[复制链接]
发表于 2023-5-20 18:57:27 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 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")这显示信息




最佳答案
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`字段的任何验证错误消息。

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

最佳答案

查看完整内容

根据提供的代码和信息,首先需要确认两个问题: 1.密码是否验证成功,如果密码验证未通过,则会导致表单数据无法提交到后台。 2.前端页面是否正确显示验证错误信息。 将 `adminuseradd` 函数中的 `print(form)` 行注释以避免在控制台输出对象并重新测试。 为了确保密码验证成功,请检查形式错误是否引发ValidationError,并更新 `adminuseradd` 中的else分支如下所示: 这将从表单打印出验证错误消息(如果存在 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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`字段的任何验证错误消息。

请重新测试代码并确保已解决密码验证和表单错误消息问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 %}

希望这能帮到你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 对象名。

希望能对你有所帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 12:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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