鱼C论坛

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

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

[复制链接]
发表于 2023-5-19 15:21:38 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 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 W8MJCNA$PM{AL@Q1UG82BYD.png
最佳答案
2023-5-19 15:21:39
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 。

希望这能帮助你解决问题!

最佳答案

查看完整内容

抱歉,我忘记提到 Django 错误消息的显示方式。 当你在表单验证中引发一个 ValidationError 时,错误消息会被添加到 form.errors 字典中。你需要在模板中显示这些错误消息。一个简单的方式就是在模板中使用 {{ form.errors }} ,这将打印出所有的表单错误。 然而,为了提供更好的用户体验,你可能想在特定的字段下面显示相关的错误消息。以下是一种在模板中显示特定字段错误的方式: 在上述模板中,我们先列出 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-19 15:21:39 | 显示全部楼层    本楼为最佳答案   
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 。

希望这能帮助你解决问题!
想知道小甲鱼最近在做啥?请访问 -> 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>  方法。

以下是你的代码修改后的样子:
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 ,这个错误消息将会被添加到表单的错误中,你就可以在模板中显示出来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-19 16:26:15 | 显示全部楼层
   def yz(self):
        pwd = self.cleaned_data.get("password")
        pwds = self.cleaned_data.get("passwords")
        if pwds != pwd:
            raise ValidationError("密码不一致")
        return pwds
应该是这个代码有问题  这个代码 不能正确的 获取 pwd 和 pwds 数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-19 17:07:57 From FishC Mobile | 显示全部楼层
tengke 发表于 2023-5-19 16:26
def yz(self):
        pwd = self.cleaned_data.get("password")
        pwds = self.cleaned_data. ...

这不一定全是后台问题
你一定要断准,究竟是前端问题还是后台问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-19 17:17:26 | 显示全部楼层
我在 adminuseradd 函数可以正常获取对应的值

在a_user 里面数据获取不到   
我感觉只能是这里的问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-20 18:06:57 | 显示全部楼层
isdkz 发表于 2023-5-19 16:13
从你的代码来看,你定义了一个  a_user  表单用于处理用户注册,其中包括了 "username", "password", 和 "p ...

按照你提供的代码  进行配置
两次密码 一致可以正常插入数据库
不一致web界面没有错误提示 只能清除两个密码数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-20 20:11:42 | 显示全部楼层
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 %}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-20 20:17:37 | 显示全部楼层
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 %}

请试试看,看看这些改变是否能满足你的需求。如果还有其他问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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