• form表单的密码是否一致校验功能


    这是form类表单,自定义的form表单,需要重写钩子函数

    """
    forms类表单
    """
    # 校验密码是否一致
    from django.core.exceptions import ValidationError
    
    from django import forms
    
    
    class RegForm(forms.Form):
        username = forms.CharField(
            max_length=16,
            label='用户名',
            label_suffix=":",   # 后缀
            error_messages={
                "max_length": "用户名最长16位",
                "required": "用户名不能为空"
            },
            widget=forms.widgets.TextInput(
                attrs={
                    "class": "form-control"
                }
            )
        )
    
        password = forms.CharField(
            min_length=6,
            label='密码',
            widget=forms.widgets.PasswordInput(
                attrs={
                    "class": "form-control"
                },
                render_value=True,      #提交数据不把密码清空
            ),
            error_messages={
                "min_length": "密码至少六位数",
                "required": "密码不能为空"
            }
        )
    
        re_password = forms.CharField(
            min_length=6,
            label='确认密码',
            widget=forms.widgets.PasswordInput(
                attrs={
                    "class": "form-control"
                }
            ),
            error_messages={
                "min_length": "密码至少六位数",
                "required": "密码不能为空"
            }
        )
    
        email = forms.EmailField(
            label='邮箱',
            widget=forms.widgets.EmailInput(
                attrs={
                    "class": "form-control"
                }
            ),
            error_messages={
                "invalid": "邮箱格式不正确!",
            }
        )
    
        # 重写全局的钩子函数,对确认密码做校验
        def clean(self):
            password = self.cleaned_data.get("password")
            re_password = self.cleaned_data.get("re_password")
    
            if re_password and re_password != password:
                self.add_error("re_password",ValidationError("两次密码不一致"))
            else:
                return self.cleaned_data
    

      在HTML里面应该这样写

    <!DOCTYPE html>
    <html lang="en">
    <head>
        {% load static %}
        <meta charset="UTF-8">
        <title>欢迎注册</title>
        <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
        <link rel="stylesheet" href="{% static 'mystyle.css' %}">
    </head>
    <body>
    <div class="container reg-form">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <form novalidate action="/register/" method="post" class="form-horizontal" enctype="multipart/form-data">
                    {% csrf_token %}
                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="{{ form_obj.username.id_for_label }}">
                            {{ form_obj.username.label }}
                        </label>
                        <div class="col-sm-8">
                            {{ form_obj.username }}
                            <span class="help-block">{{ form_obj.username.errors.0 }}</span>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="{{ form_obj.password.id_for_label }}">
                            {{ form_obj.password.label }}
                        </label>
                        <div class="col-sm-8">
                            {{ form_obj.password }}
                            <span class="help-block">{{ form_obj.password.errors.0 }}</span>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="{{ form_obj.re_password.id_for_label }}">
                            {{ form_obj.re_password.label }}
                        </label>
                        <div class="col-sm-8">
                            {{ form_obj.re_password }}
                            <span class="help-block">{{ form_obj.re_password.errors.0 }}</span>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="{{ form_obj.email.id_for_label }}">
                            {{ form_obj.email.label }}
                        </label>
                        <div class="col-sm-8">
                            {{ form_obj.email }}
                            <span class="help-block">{{ form_obj.email.errors.0 }}</span>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="id_avatar">
                            头像
                        </label>
                        <div class="col-sm-8">
                            <label for="id_avatar" id="id_avatar_lab">
                                <img id="id_avatar-img"  src="{% static 'images/default.jpg' %}" alt="">
                            </label>
                            <input type="file" name="avatar" id="id_avatar" style="display: none">
                            <span class="help-block"></span>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" class="btn btn-primary">注册</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    

      在视图函数里面

     1 def register(request):
     2     if request.method == 'POST':
     3         form_obj = forms.RegForm(request.POST)
     4         # 检验
     5         if form_obj.is_valid():
     6             # 检验通过
     7             # 去数据库创建一个新的用户
     8             # 删除多余的字段
     9             form_obj.cleaned_data.pop('re_password')
    10             models.UserInfo.objects.create_user(**form_obj.cleaned_data)
    11         else:
    12             # 将错误的信息返回到注册页面
    13             return render(request, 'register.html', {"form_obj": form_obj})
    14     form_obj = forms.RegForm()
    15     return render(request, 'register.html', {"form_obj": form_obj}) 
    
    

    form_obj.is_valid()的执行顺序:
      1. 先按照form类中定义的字段顺序,依次校验每一个字段(内置的校验规则)
      2. 每个字段先校验内置的规则, 然后字校验clean_开头的规则
      3. 整个for循环走完之后, 再调用form类中定义的clean()方法

     

    即可完成校验两次密码是否一致的功能

  • 相关阅读:
    Go对比其他语言新特性2(函数、包、错误处理)
    计算机基础知识
    GO的下载和环境配置,Goland编译器的配置和初始化项目
    软件工程第五次作业
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    软件工程结对第二次作业
    软件工程结对第一次作业
  • 原文地址:https://www.cnblogs.com/wuyiyuan/p/12043732.html
Copyright © 2020-2023  润新知