验证密码是否一致 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")这显示信息
根据提供的代码和信息,首先需要确认两个问题:
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.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 %}
希望这能帮到你!
根据给出的代码,我发现可能有两个问题:
确认两次输入密码一致的验证逻辑不应该放在 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]