# 自定义验证规则 方式一from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator
classMyForm(Form):
user = fields.CharField(
validators=[RegexValidator(r'^[0-9]+$','请输入数字'), RegexValidator(r'^159[0-9]+$','数字必须以159开头')],)
# 自定义验证规则 方式二import re
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.exceptions import ValidationError
defmobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')ifnot mobile_re.match(value):raise ValidationError('手机号码格式错误')classPublishForm(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'邮箱'}))
# 自定义方法 方式三from django import forms
from django.forms import fields
from django.forms import widgets
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
classFInfo(forms.Form):
username = fields.CharField(max_length=5,
validators=[RegexValidator(r'^[0-9]+$','Enter a valid extension.','invalid')],)
email = fields.EmailField()defclean_username(self):"""
Form中字段中定义的格式匹配完之后,执行此方法进行验证
:return:
"""
value = self.cleaned_data['username']if"666"in value:raise ValidationError('666已经被玩烂了...','invalid')return value
# 同时生成多个标签进行验证from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator
############## 自定义字段 ##############classPhoneField(fields.MultiValueField):def__init__(self,*args,**kwargs):# Define one message for all fields.
error_messages ={'incomplete':'Enter a country calling code and a phone number.',}# Or define a different message for each field.
f =(
fields.CharField(
error_messages={'incomplete':'Enter a country calling code.'},
validators=[
RegexValidator(r'^[0-9]+$','Enter a valid country calling code.'),],),
fields.CharField(
error_messages={'incomplete':'Enter a phone number.'},
validators=[RegexValidator(r'^[0-9]+$','Enter a valid phone number.')],),
fields.CharField(
validators=[RegexValidator(r'^[0-9]+$','Enter a valid extension.')],
required=False,),)super(PhoneField, self).__init__(error_messages=error_messages, fields=f, require_all_fields=False,*args,**kwargs)defcompress(self, data_list):"""
当用户验证都通过后,该值返回给用户
:param data_list:
:return:
"""return data_list
############## 自定义插件 ##############classSplitPhoneWidget(widgets.MultiWidget):def__init__(self):
ws =(
widgets.TextInput(),
widgets.TextInput(),
widgets.TextInput(),)super(SplitPhoneWidget, self).__init__(ws)defdecompress(self, value):"""
处理初始值,当初始值initial不是列表时,调用该方法
:param value:
:return:
"""if value:return value.split(',')return[None,None,None]