zoukankan      html  css  js  c++  java
  • Django Form表单验证和字段验证

    摘要

    对用户提交的数据的过滤、验证、避免非法数据提交、对用户输入的数据格式的提示。这些都是我们在页面中必须实现的一个功能。例如我们可以使用自己写正则表达式来验证,这是一种比较常常想到的方法,例如网上大神们收集的一些常见正则表达式集合 :原文猛戳

    Django-Form


    前提

    但是在Django中,我们拥有最简单实用快速的方式来实现这个功能.
    我们以一个简单的注册页面来开始:

    # urls.py
    url(r'^register/', views.Register.as_view(),name='register'),
    
    # views.py
    class Register(View):
        def get(self, request):
            return render(request, 'register.html',)
    
        def post(self, request):
            return HttpResponse("OK")
    
    # register.html
    <form action="{% url 'register' %}" method="post">
        {% csrf_token %}
            <p><input type="text" name="user"></p>
            <p><input type="text" name="password"></p>
            <p><input type="text" name="email"></p>
            <p><input type="submit" name="提交"></p>
    </form>
    

    在这样的前提下,我们需要对用户输入的数据做一个限制,需要做哪些限制呢,我们大概简单举个例子:

    • 用户名:长度大于6小于24,不能有特殊字符,只允许数字字母下划线,不能为空
    • 密码:长度大于6小于32,不能为空
    • 邮箱:满足邮箱格式,不能为空

    实现上面的需求

    # views.py
    
    class FormVerify(forms.Form):
        username = fields.CharField(max_length=24,
                                    min_length=6,
                                    error_messages={
                                        "required": "用户名不能为空",
                                        'min_length': "长度小于6",
                                        'max_length': "长度大于32",
                                    })
        email = fields.EmailField(
            error_messages={
                'required': "邮箱不能为空",
                "invalid": "邮箱格式错误",
            }
        )
        password = fields.CharField(
            max_length=32,
            min_length=6,
            error_messages={
                'required': "密码不能为空",
                'min_length': "密码长度不能小于6",
                'max_length': "密码长度不能大于32"
            },
            widget=widgets.PasswordInput()
        )
    
    
    
    
    class Register(View):
        def get(self, request):
            return render(request, 'register.html',)
    
        def post(self, request):
            return HttpResponse("OK")
    

    步骤说明:

    1. 定制一个类,需要继承forms.Form
    2. 类中的字段名必须和form中提交的数据的name一致,使用fields中各种类型的字段
    3. 然后对这个字段指定自己想要的各种约束条件

    Django中内置字段整理

    官方文档

    基类Field
    required                     是否可以为空
    label                        等同于html中label,input框前面显示的内容
    label_suffix                 lable显示内容与input之间的分隔符,例如冒号:
    initial                      初始值
    widget                       自定制生成html的标签
    help_text                    input框显示的提示内容
    error_messages               定制各种错误信息
    validators=[]                自定制匹配规则
    localize                     本地化,一般会在时间上使用
    disabled                     可以将input设置成不可编辑状态
    has_changed()                监测字段内容是否改变
    show_hidden_initial=False,   是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
    
    CharField(Field)

    文本类型

    Default widget: TextInput
    max_length
    min_length
    strip=True    去掉输入中的空格
    empty_value    空值的默认值
    
    IntegerField(Field)

    整数类型

    max_value
    min_value
    
    FloatField(IntegerField)

    浮点数类型

    Default widget: NumberInput
    Error message keys: required, invalid, max_value, min_value
    
    DecimalField(IntegerField)

    小数类型

    Default widget: NumberInput when Field.localize is False, else TextInput.
    Error message keys: required, invalid, max_value, min_value, max_digits, max_decimal_places, max_whole_digits
    
    max_value  最大值
    min_value  最小值
    max_digits  总长度
    decimal_places  小数长度
    
    ChoiceField(Field)

    单选类型

    Default widget: Select
    Error message keys: required, invalid_choice
    
    MultipleChoiceField(ChoiceField)

    多选类型

    Default widget: SelectMultiple
    Error message keys: required, invalid_choice, invalid_list
    
    TypedMultipleChoiceField(MultipleChoiceField)

    MultipleChoiceField,但是接受额外的参数coerceempty_value

    Default widget: SelectMultiple
    Error message keys: required, invalid_choice
    
    
    GenericIPAddressField(CharField)

    IP地址

    Default widget: TextInput
    Error message keys: required, invalid
    protocol   支持的IP地址类型: both (default), IPv4 or IPv6
    unpack_ipv4   解析为ipv4地址,可以将::ffff:192.0.2.1解析为192.0.2.1
    
    TypedChoiceField(ChoiceField)

    ChoiceField,但是接受额外的参数coerceempty_value

    Default widget: Select
    Error message keys: required, invalid_choice
    coerce         接收一个参数并返回强制转换后的值的一个函数
    empty_value    空值的默认值
    
    TimeField(BaseTemporalField)

    时间格式类型,datetime.time 对象

    Default widget: TextInput
    Error message keys: required, invalid
    input_formats  如果未指定,默认类型:
             '%H:%M:%S',     # '14:30:59'
             '%H:%M',        # '14:30'
    
    DateField(BaseTemporalField)

    日期格式类型datetime.date 对象

    Default widget: DateInput
    Error message keys: required, invalid
    input_formats: 默认格式(default):
            ['%Y-%m-%d',      # '2006-10-25'
             '%m/%d/%Y',      # '10/25/2006'
             '%m/%d/%y']      # '10/25/06'
    但是在seettings中设置 USE_L10N=False,以下的格式也将包含在默认的输入格式中
             ['%b %d %Y',      # 'Oct 25 2006'
              '%b %d, %Y',     # 'Oct 25, 2006'
              '%d %b %Y',      # '25 Oct 2006'
              '%d %b, %Y',     # '25 Oct, 2006'
              '%B %d %Y',      # 'October 25 2006'
              '%B %d, %Y',     # 'October 25, 2006'
              '%d %B %Y',      # '25 October 2006'
              '%d %B, %Y']     # '25 October, 2006'
    
    DateTimeField(BaseTemporalField)

    时间日期格式类型, datetime.datetime对象

    Default widget: DateTimeInput
    Error message keys: required, invalid
    input_formats   默认格式:
              ['%Y-%m-%d %H:%M:%S',    # '2006-10-25 14:30:59'
               '%Y-%m-%d %H:%M',       # '2006-10-25 14:30'
               '%Y-%m-%d',             # '2006-10-25'
               '%m/%d/%Y %H:%M:%S',    # '10/25/2006 14:30:59'
               '%m/%d/%Y %H:%M',       # '10/25/2006 14:30'
               '%m/%d/%Y',             # '10/25/2006'
               '%m/%d/%y %H:%M:%S',    # '10/25/06 14:30:59'
               '%m/%d/%y %H:%M',       # '10/25/06 14:30'
               '%m/%d/%y']             # '10/25/06'
    
    
    • 将在1.7版本起启用,改用SplitDateTimeWidget
    EmailField(CharField)

    邮件类型

    Default widget: EmailInput
    Error message keys: required, invalid
    
    URLField(CharField)

    URL类型

    Default widget: URLInput
    Error message keys: required, invalid
    max_length
    min_length
    
    SlugField(CharField)

    数字,字母,下划线,减号

    Default widget: TextInput
    Error messages: required, invalid
    allow_unicode 
    
    FileField(Field)

    文件,一个UploadedFile对象,可以在后端拿到这个对象后使用chunks 方法来保存文件

    Default widget: ClearableFileInput
    Error message keys: required, invalid, missing, empty, max_length
    max_length 文件最大长度
    allow_empty_file 是否允许文件为空
    
    FilePathField(ChoiceField)

    文件路径,Unicode对象

    Default widget: Select
    Error message keys: required, invalid_choice
    path 路径
    recursive          Default is False 是否递归
    match              自定义正则匹配,匹配这个表达式的名称才允许作为选项
    allow_files        Default is True   是否包含文件
    allow_folders      Default is False  是否包含文件夹
    
    ImageField(FileField)

    使用ImageField需要安装Pillow并支持使用的图像格式,UploadedFile对象将有一个额外的image属性,包含Pillow 图像实例,用于检查文件是一个有效的图像且:
    form表单中:enctype="multipart/form-data
    views函数中:obj = MyForm(request.POST, request.FILES)

    Default widget: ClearableFileInput
    Error message keys: required, invalid, missing, empty, invalid_image
    
    
    RegexField(CharField)
    Default widget: TextInput
    Error message keys: required, invalid
    regex      自定义正则
    strip      Defaults to False 去除空格
    
    • 自1.8版起已弃用,会在Django 2.0中删除
    UUIDField(CharField)

    匹配uuid类型

    Default widget: TextInput
    Error message keys: required, invalid
    

    ComboField(Field)

    使用多个验证方式同时验证

    Default widget: TextInput
    Error message keys: required, invalid
    fields=[]
            fields=[CharField(max_length=20), EmailField()] 以邮件的方式匹配,但是长度不超过20
            
    
    MultiValueField(Field)

    抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用

    Default widget: TextInput
    Error message keys: required, invalid, incomplete
    fields=()
    require_all_fields    Defaults to True
    widget
    compress(data_list)
    
    SplitDateTimeField(MultiValueField)

    将字符串转化为有效的时间对象类型

    Default widget: SplitDateTimeWidget
    Error message keys: required, invalid, invalid_date, invalid_time
    input_date_formats=[]
            ['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']用于尝试将字符串转换为有效的datetime.date对象的格式列表。
    input_time_formats=[]
            ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']用于尝试将字符串转换为有效的datetime.time对象的格式列表
    
    ModelChoiceField(ChoiceField)
    Default widget: Select
    Error message keys: required, invalid_choice
    queryset
    empty_label
    to_field_name
    Error message keys: required, list, invalid_choice, invalid_pk_value
    queryset
    to_field_name
    
    ModelMultipleChoiceField(ModelChoiceField)
    Default widget: SelectMultiple
    Empty value: An empty QuerySet
    
    DurationField(Field)
    Default widget: TextInput
    Error message keys: required, invalid.
    
    BooleanField(Field)

    布尔类型

    Default widget: CheckboxInput
    True or False value.
    Error message keys: required
    
    NullBooleanField(BooleanField)
    Default widget: NullBooleanSelect
     True, False or None value.
    
    custom

    如果内置的不能满足你的需求,那么你可以自定义自定义的匹配类型

    • 必须继承django.forms.Field
    • 自己实现clean()
    • 实例化参数:(required, label, initial, widget, help_text)
  • 相关阅读:
    b_lc_数组中最大数对和的最小值(排序+思维 | 进阶:第k)
    b_lc_使用服务器处理任务(模拟 + 堆)
    b_lc_插入后的最大值(贪心+区分正负数)
    b_lc_蓄水(反向思维:枚举取水次数)
    万能JDBC工具类【DBUtil 】
    Eureka服务注册中心
    springboot dubbo+zookeeper
    Thymleaf引擎模板
    多环境切换 & JSR303数据校验
    yaml配置注入
  • 原文地址:https://www.cnblogs.com/forsaken627/p/12521955.html
Copyright © 2011-2022 走看看