python 搭建用户注册界面 匹配失败
本帖最后由 tengke 于 2023-5-19 17:15 编辑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 yz(self):
pwd = self.cleaned_data.get("password")
pwds = self.cleaned_data.get("passwords")
if pwds != pwd:
raise ValidationError("密码不一致")
return pwds
def adminuseradd(request):
if request.method == "GET":
form = a_user()
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})
数据没有报错 大佬麻烦看看
1 tengke 发表于 2023-5-20 18:06
按照你提供的代码进行配置
两次密码 一致可以正常插入数据库
不一致web界面没有错误提示 只能清除两 ...
抱歉,我忘记提到 Django 错误消息的显示方式。
当你在表单验证中引发一个ValidationError时,错误消息会被添加到form.errors字典中。你需要在模板中显示这些错误消息。一个简单的方式就是在模板中使用{{ form.errors }} ,这将打印出所有的表单错误。
然而,为了提供更好的用户体验,你可能想在特定的字段下面显示相关的错误消息。以下是一种在模板中显示特定字段错误的方式:
<form method="post">
{% csrf_token %}
{{ form.username.label_tag }} {{ form.username }}
{{ form.password.label_tag }} {{ form.password }}
{{ form.passwords.label_tag }} {{ form.passwords }}
{% if form.errors %}
<ul>
{% for field in form %}
{% for error in field.errors %}
<li><strong>{{ field.label }}</strong>: {{ error|escape }}</li>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<li><strong>非字段错误</strong>: {{ error|escape }}</li>
{% endfor %}
</ul>
{% endif %}
<button type="submit">注册</button>
</form>
在上述模板中,我们先列出了每个字段的标签和字段自身,然后检查form.errors ,如果有错误,我们就为每个字段的每个错误和非字段错误创建一个列表项。
注意, form.non_field_errors用于显示那些不特定于单个字段的错误,这正好适用于你在clean方法中引发的ValidationError 。
希望这能帮助你解决问题!
从你的代码来看,你定义了一个a_user表单用于处理用户注册,其中包括了 "username", "password", 和 "passwords" 字段。同时你在a_user表单中也定义了一个yz方法用于验证两次密码是否一致。你的adminuseradd视图也处理了 GET 和 POST 请求,对表单的有效性进行检查。
然而,根据 Django 的ModelForm表单验证流程,你定义的yz方法并没有在验证过程中被调用。因为ModelForm的验证流程只会自动调用clean_<fieldname>方法,其中<fieldname>是你想要对应的字段名。如果你想在验证过程中包含自定义的验证,你应该使用clean或者clean_<fieldname>方法。
以下是你的代码修改后的样子:
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")
if pwds != pwd:
raise forms.ValidationError("密码不一致")
return cleaned_data
def adminuseradd(request):
if request.method == "GET":
form = a_user()
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})
在上述代码中,我将yz方法改名为clean 。当表单调用is_valid()方法时,Django 会自动调用这个clean方法进行验证。如果pwds和pwd不一致,它将引发一个ValidationError ,并附上错误消息 "密码不一致"。这样,在你的视图函数中,如果form.is_valid()返回False ,这个错误消息将会被添加到表单的错误中,你就可以在模板中显示出来。 def yz(self):
pwd = self.cleaned_data.get("password")
pwds = self.cleaned_data.get("passwords")
if pwds != pwd:
raise ValidationError("密码不一致")
return pwds
应该是这个代码有问题这个代码 不能正确的 获取 pwd 和 pwds 数据 tengke 发表于 2023-5-19 16:26
def yz(self):
pwd = self.cleaned_data.get("password")
pwds = self.cleaned_data. ...
这不一定全是后台问题
你一定要断准,究竟是前端问题还是后台问题 我在 adminuseradd 函数可以正常获取对应的值
在a_user 里面数据获取不到
我感觉只能是这里的问题了 isdkz 发表于 2023-5-19 16:13
从你的代码来看,你定义了一个a_user表单用于处理用户注册,其中包括了 "username", "password", 和 "p ...
按照你提供的代码进行配置
两次密码 一致可以正常插入数据库
不一致web界面没有错误提示 只能清除两个密码数据 isdkz 发表于 2023-5-20 19:21
抱歉,我忘记提到 Django 错误消息的显示方式。
当你在表单验证中引发一个ValidationError时,错 ...
多谢大佬 一下是我修改之后的数据
——————————————————————————————————
html界面
{% extends 'rootyongh.html' %}
{% block b %}
<form method="post" novalidate>
{% csrf_token %}
{% for zz in form %}
<div class="form-group">
{{ zz.label }} : {{ zz }}
</div>
{% endfor %}
<input type="submit" value="提交">
<input type="reset" name="reset" id="reset" value="重置">
{% if form.errors %}
<ul>
{% for field in form %}
{% for error in field.errors %}
<li><strong>{{ field.label }}</strong>: {{ error|escape }}</li>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
{{ error|escape }}
{% endfor %}
</ul>
{% endif %}
{% endblock %} tengke 发表于 2023-5-20 20:11
多谢大佬 一下是我修改之后的数据
——————————————————————————————— ...
你的修改看起来不错,应该能够在表单验证失败时正确显示错误消息。
注意,你的 HTML 模板中,密码不匹配的错误(是一个非字段错误)应该会在{% for error in form.non_field_errors %}循环中被显示出来。
如果你想要让错误消息有更好的可视化效果,比如更醒目的颜色或者样式,你可以用 CSS 来增强它们的样式。例如,你可以把错误消息放在一个带有红色字体的div标签内,像这样:
{% for error in form.non_field_errors %}
<div style="color: red;">{{ error|escape }}</div>
{% endfor %}
或者,如果你使用 Bootstrap 或其他 CSS 框架,你可以利用框架的预定义样式,如下:
{% for error in form.non_field_errors %}
<div class="alert alert-danger">{{ error|escape }}</div>
{% endfor %}
请试试看,看看这些改变是否能满足你的需求。如果还有其他问题,欢迎继续提问。
页:
[1]