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()方法

 

 

即可完成校驗兩次密碼是否一致的功能


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM