tengke 发表于 2023-5-19 15:21:38

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

isdkz 发表于 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 。

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

isdkz 发表于 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 ,这个错误消息将会被添加到表单的错误中,你就可以在模板中显示出来。

tengke 发表于 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 数据

wp231957 发表于 2023-5-19 17:07:57

tengke 发表于 2023-5-19 16:26
def yz(self):
      pwd = self.cleaned_data.get("password")
      pwds = self.cleaned_data. ...

这不一定全是后台问题
你一定要断准,究竟是前端问题还是后台问题

tengke 发表于 2023-5-19 17:17:26

我在 adminuseradd 函数可以正常获取对应的值

在a_user 里面数据获取不到   
我感觉只能是这里的问题了

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

isdkz 发表于 2023-5-19 16:13
从你的代码来看,你定义了一个a_user表单用于处理用户注册,其中包括了 "username", "password", 和 "p ...

按照你提供的代码进行配置
两次密码 一致可以正常插入数据库
不一致web界面没有错误提示 只能清除两个密码数据

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

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


请试试看,看看这些改变是否能满足你的需求。如果还有其他问题,欢迎继续提问。
页: [1]
查看完整版本: python 搭建用户注册界面 匹配失败