千家信息网

Django中如何使用Validators校验组件

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,Django中如何使用Validators校验组件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用form组件实现注册功能的例子先
千家信息网最后更新 2024年11月22日Django中如何使用Validators校验组件

Django中如何使用Validators校验组件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

使用form组件实现注册功能的例子

  1. 先定义好一个RegForm类

from django import forms# 按照Django form组件的要求自己写一个类class RegForm(forms.Form):    name = forms.CharField(label="用户名")    pwd = forms.CharField(label="密码")
  1. 再写一个视图函数

# 使用form组件实现注册方式def register2(request):    form_obj = RegForm()    if request.method == "POST":        # 实例化form对象的时候,把post提交过来的数据直接传进去        form_obj = RegForm(request.POST)        # 调用form_obj校验数据的方法        if form_obj.is_valid():            return HttpResponse("注册成功")    return render(request, "register2.html", {"form_obj": form_obj})
  1. html使用form

        注册2    
{% csrf_token %}
{{ form_obj.name }} {{ form_obj.name.errors.0 }}
{{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}

常用字段与插件

initial属性-input框里面的初始值

class LoginForm(forms.Form):    username = forms.CharField(        min_length=8,        label="用户名",        initial="张三"  # 设置默认值    )    pwd = forms.CharField(min_length=6, label="密码")

error_messages-重写错误信息

class LoginForm(forms.Form):    username = forms.CharField(        min_length=8,        label="用户名",        initial="张三",        error_messages={            "required": "不能为空",            "invalid": "格式错误",            "min_length": "用户名最短8位"        }    )    pwd = forms.CharField(min_length=6, label="密码")

password插件

使得插件需统一引入: from django.forms import widgets

class LoginForm(forms.Form):    ...    pwd = forms.CharField(        min_length=6,        label="密码",        widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)    )

radioSelect组件

class LoginForm(forms.Form):    username = forms.CharField(        min_length=8,        label="用户名",        initial="张三",        error_messages={            "required": "不能为空",            "invalid": "格式错误",            "min_length": "用户名最短8位"        }    )    pwd = forms.CharField(min_length=6, label="密码")    gender = forms.fields.ChoiceField(        choices=((1, "男"), (2, "女"), (3, "保密")),        label="性别",        initial=3,        widget=forms.widgets.RadioSelect()    )

单选Select组件

class LoginForm(forms.Form):    ...    hobby = forms.fields.ChoiceField(        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),        label="爱好",        initial=3,        widget=forms.widgets.Select()    )

多选Select组件

class LoginForm(forms.Form):    ...    hobby = forms.fields.MultipleChoiceField(        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),        label="爱好",        initial=[1, 3],        widget=forms.widgets.SelectMultiple()    )

单选checkbox组件

class LoginForm(forms.Form):    ...    keep = forms.fields.ChoiceField(        label="是否记住密码",        initial="checked",        widget=forms.widgets.CheckboxInput()    )

多选checkbox组件

class LoginForm(forms.Form):    ...    hobby = forms.fields.MultipleChoiceField(        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),        label="爱好",        initial=[1, 3],        widget=forms.widgets.CheckboxSelectMultiple()    )
  • 关于choice的注意事项

在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 获取的值无法实时更新,那么需要自定义构造方法从而达到此目的

from django.forms import Formfrom django.forms import widgetsfrom django.forms import fieldsclass MyForm(Form):    user = fields.ChoiceField(        # choices=((1, '上海'), (2, '北京'),),        initial=2,        widget=widgets.Select    )    def __init__(self, *args, **kwargs):        super(MyForm,self).__init__(*args, **kwargs)        # self.fields['user'].choices = ((1, '上海'), (2, '北京'),)        # 或        self.fields['user'].choices = models.Classes.objects.all().values_list('id','caption')

Django Form所有内置字段

Field    required=True,               是否允许为空    widget=None,                 HTML插件    label=None,                  用于生成Label标签或显示内容    initial=None,                初始值    help_text='',                帮助信息(在标签旁边显示)    error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}    validators=[],               自定义验证规则    localize=False,              是否支持本地化    disabled=False,              是否可以编辑    label_suffix=None            Label内容后缀  CharField(Field)    max_length=None,             最大长度    min_length=None,             最小长度    strip=True                   是否移除用户输入空白 IntegerField(Field)    max_value=None,              最大值    min_value=None,              最小值 FloatField(IntegerField)    ... DecimalField(IntegerField)    max_value=None,              最大值    min_value=None,              最小值    max_digits=None,             总长度    decimal_places=None,         小数位长度 BaseTemporalField(Field)    input_formats=None          时间格式化    DateField(BaseTemporalField)    格式:2015-09-01TimeField(BaseTemporalField)    格式:11:12DateTimeField(BaseTemporalField)格式:2015-09-01 11:12 DurationField(Field)            时间间隔:%d %H:%M:%S.%f    ... RegexField(CharField)    regex,                      自定制正则表达式    max_length=None,            最大长度    min_length=None,            最小长度    error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'} EmailField(CharField)          ... FileField(Field)    allow_empty_file=False     是否允许空文件 ImageField(FileField)          ...    注:需要PIL模块,pip3 install Pillow    以上两个字典使用时,需要注意两点:        - form表单中 enctype="multipart/form-data"        - view函数中 obj = MyForm(request.POST, request.FILES) URLField(Field)    ...  BooleanField(Field)      ... NullBooleanField(BooleanField)    ... ChoiceField(Field)    ...    choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),)    required=True,             是否必填    widget=None,               插件,默认select插件    label=None,                Label内容    initial=None,              初始值    help_text='',              帮助提示  ModelChoiceField(ChoiceField)    ...                        django.forms.models.ModelChoiceField    queryset,                  # 查询数据库中的数据    empty_label="---------",   # 默认空显示内容    to_field_name=None,        # HTML中value的值对应的字段    limit_choices_to=None      # ModelForm中对queryset二次筛选     ModelMultipleChoiceField(ModelChoiceField)    ...                        django.forms.models.ModelMultipleChoiceField       TypedChoiceField(ChoiceField)    coerce = lambda val: val   对选中的值进行一次转换    empty_value= ''            空值的默认值 MultipleChoiceField(ChoiceField)    ... TypedMultipleChoiceField(MultipleChoiceField)    coerce = lambda val: val   对选中的每一个值进行一次转换    empty_value= ''            空值的默认值 ComboField(Field)    fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式                               fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),]) MultiValueField(Field)    PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用 SplitDateTimeField(MultiValueField)    input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']    input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中    path,                      文件夹路径    match=None,                正则匹配    recursive=False,           递归下面的文件夹    allow_files=True,          允许文件    allow_folders=False,       允许文件夹    required=True,    widget=None,    label=None,    initial=None,    help_text='' GenericIPAddressField    protocol='both',           both,ipv4,ipv6支持的IP格式    unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用 SlugField(CharField)           数字,字母,下划线,减号(连字符)    ... UUIDField(CharField)           uuid类型

Validators校验组件

方式一

from django.forms import Formfrom django.forms import widgetsfrom django.forms import fieldsfrom django.core.validators import RegexValidator class MyForm(Form):    user = fields.CharField(        validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],    )

方式二

import refrom django.forms import Formfrom django.forms import widgetsfrom django.forms import fieldsfrom django.core.exceptions import ValidationError# 自定义验证规则def mobile_validate(value):    mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')    if not mobile_re.match(value):        raise ValidationError('手机号码格式错误')class PublishForm(Form):    title = fields.CharField(max_length=20,                            min_length=5,                            error_messages={'required': '标题不能为空',                                            'min_length': '标题最少为5个字符',                                            'max_length': '标题最多为20个字符'},                            widget=widgets.TextInput(attrs={'class': "form-control",                                                          'placeholder': '标题5-20个字符'}))    # 使用自定义验证规则    phone = fields.CharField(validators=[mobile_validate, ],                            error_messages={'required': '手机不能为空'},                            widget=widgets.TextInput(attrs={'class': "form-control",                                                          'placeholder': u'手机号码'}))    email = fields.EmailField(required=False,                            error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},                            widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

补充进阶

form组件应用Bootstrap样式

          login
{% csrf_token %}
{{ form_obj.username }} {{ form_obj.username.errors.0 }}
{{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
{% for radio in form_obj.gender %} {% endfor %}

ModelForm - form与model的终极结合

class BookForm(forms.ModelForm):    class Meta:        model = models.Book        fields = "__all__"        labels = {            "title": "书名",            "price": "价格"        }        widgets = {            "password": forms.widgets.PasswordInput(attrs={"class": "c1"}),        }
  • class Meta下常用参数

model = models.Student  # 对应的Model中的类fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段exclude = None  # 排除的字段labels = None  # 提示信息help_texts = None  # 帮助提示信息widgets = None  # 自定义插件error_messages = None  # 自定义错误信息

Form组件知识点总结

1. 定义Form

form django import formsclass RegForm(forms.Form):    username = forms.CharField()    pwd = forms.CharField()

2. 使用Form

视图函数

from app01.forms import *form_obj = RegForm()return render(request,'reg.html',{'form_obj':form_obj})form_obj = RegForm(request.POST)form_obj.is_valid()     -- 》布尔值form_obj.cleaned_data   --》 {}    所有通过校验的字段的名字和值

模板

{{ form_obj.as_p  }}            --》生成所有的字段  p  label input框{{ form_obj.username }}         --》 生成某个字段的对应的input标签{{ form_obj.username.label }}   --》 生成某个字段的标签名  {{ form_obj.username.id_for_label }}    --》 生成某个字段id{{ form_obj.username.errors }}  --》 生成某个字段的所有的错误信息  {{ form_obj.username.errors.0 }}  --》 生成某个字段的第一个的错误信息  {{ form_obj.errors }}           --》 生成某form表单的所有的错误信息

字段类型和参数

  1. 字段类型

     CharField() ChoiceField()


  2. 参数

     label        中文的提示 initial      初始值 min_length   最小长度 max_length   最大长度 required     是否是必填的 disabled     是否不可修改 error_messages = { 'min_length' : '太短了', 'max_length' : '够长了' 'required':   '不能为空' } validators = [ 校验器1,校验器2 ]


  3. 校验

  • 内置的校验

      min_length   最小长度  max_length   最大长度  required     是否是必填的


  • 自定义校验器

      from django.core.validators import RegexValidator  RegexValidator(正则,错误提示)


    函数

      from django.core.exceptions import ValidationError  def check_name(value):      if 'alex' in value:              raise ValidationError('不符合社会主义核心价值观')


  1. 钩子

    局部钩子

     def clean_字段名(self):   通过校验:返回当前的字段的值   不通过:  raise ValidationError()


    全局钩子

     def clean(self):   通过校验: 返回self.cleaned_data   不通过:           self.add_error('字段名','错误提示')           raise ValidationError()


关于Django中如何使用Validators校验组件问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

字段 错误 组件 格式 长度 信息 生成 最大 插件 文件 用户 最小 密码 用户名 提示 验证 内容 数据 帮助 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州外贸行业进口软件代理服务器 租的服务器需要数据管理员吗 数据库中数据可以是备注型么 app软件开发分层 软件开发.做技术好还是管理 dell机架式服务器拆机 互联网大数据和科技金融 上海酷宝网络技术有限公司面试 软件开发工作中存在的不足 正规的浪潮服务器零售商 消防队网络安全教育新闻稿 网络安全宣传周剧情 我的世界服务器未启动 网络安全法开始实施的日期 网络安全知识网络安全法规 镇江市网络安全保卫支队电话 计算机网络技术专业上班 前端提升web应用的网络安全性 西安高新区网络安全会议 网络安全核心 合肥政务软件开发多少钱 微服天下网络技术有限公司 一年级网络安全知识十条 全国高校数据库专业排名 数据库加密安全教程 大容量服务器 长视频剪辑软件开发 建设银行软件开发岗 学网络安全与执法可以干刑警吗 owo网络技术
0