千家信息网

Django中如何使用Validators校验组件

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Django中如何使用Validators校验组件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用form组件实现注册功能的例子先
千家信息网最后更新 2026年11月01日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校验组件问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

0