django中的form表单验证

一. form表单验证

  form可以生成html标签,可以校验,可以保留上次输入内容

  1. 创建form表单

from django import forms

class MyForm(forms.Form):
    username = forms.CharField(
        label = "用户名",    #
        min_length = 6,
        validators=[]   ,    # 校验器
        widget=forms.TextInput(attrs={}) , # 小插件
)

常用的form字段
CharField()
ChoiceField()

常用的内置字段
label                      用于生成label标签或者显示内容
required=True        是否可以为空
error_messages={}    错误信息{"required":"不能为空"}
widget                    小插件
help_text=""            帮助信息
validators=[]           校验器,可以使用Regexvalidator()
          from djang.core.validators impor Regexvalidator
                               还可以自定义校验器
initial=xxx                 默认值
strip=True                 移除两端空白
choices=((1,""))      选项
        
插件中常用的种类
PasswordInput        密码框
Select()                  单选下拉框
RadioSelect()           单选按钮
创建form

  2. 在view中的方法

    from_obj = MyForm()    创建对象,用来渲染页面

    form_obj = MyForm(request.POST)  把post提交的数据进行校验

    form_obj.is_valid()      判断是否校验成功

    form_obj.cleaned_data    在is_valid()之后使用,获取所有校验完的数据

    form_obj.error.as_data    获取错误信息字典形式的对象

    form_obj.add_error("字段","错误信息")  给某个字段添加错误信息

    form_obj.fields        存有字段的有序字典

二. RegexValidator校验器

  校验器一般是根据正则来校验是否符合

  1. RegexValidator校验器

    from django.core.validators import RegexValidator

    validators = [RegexValidator(r"正则","错误信息")...]

  2. 自定义校验器

import re
from django.core.exceptions import ValidationError

def my_validator(value):
    reg = re.compile(r"正则")
    if not reg.match(value):
        raise ValidationError("错误信息")

validators = [my_validator,...]
根据re自定义校验器

三. hook钩子

  在创建的form字段类中加hook钩子

  1. 局部钩子

def clean_字段(self):
    value = self.cleaned_data.get("字段")
    if 验证value条件:
         raise ValidationError("错误信息")    # 错误时
    else:
        return value    # 成功时要返回value
局部钩子

  2. 全局钩子

def clean(self):
    value = self.cleaned_data.get("字段")
    if 校验条件:
        self.add_error("字段","错误信息")    #给某个字段添加错误
        # raise ValidationError("错误信息")  # 给全局添加错误
    else:
        return cleaned_data        # 返回全部信息
全局钩子

四. 校验顺序

  1. 个人猜测版

  字段校验 => 验证器=> 局部钩子 => 全局钩子

  2. 网上搜索版

    先来归纳一下整个流程

    (1)首先is_valid()起手,看seld.errors中是否值,只要有值就是flase

    (2)接着分析errors.里面判断_errors是都为空,如果为空返回self.full_clean(),否则返回self._errors

    (3)现在就要看full_clean(),是何方神圣了,里面设置_errors和cleaned_data这两个字典,一个存错误字段,一个存储正确字段。

    (4)在full_clean最后有一句self._clean_fields(),表示校验字段

    (5)在_clean_fields函数中开始循环校验每个字段,真正校验字段的是field.clean(value),怎么校验的不管

    (6)在_clean_fields中可以看到,会将字段分别添加到_errors和cleaned_data这两个字典中

    (7)结尾部分还设置了钩子,找clean_XX形式的,有就执行。执行错误信息也会添加到_errors中

    (8)整个校验过程完成

猜你喜欢

转载自www.cnblogs.com/q767498226/p/10527669.html