验证函数只接收一个参数,不需要返回值。验证错误时抛出 forms.ValidationError
异常,该异常的 code
参数用于指定需要显示 error_messages
的键名,没有定义时显示异常的消息
form django import froms
import re
def validate_binary(value):
if not re.search(r'^[01]+$', value):
raise forms.ValidationError('default invalid message', code='invalid_number')
在初始化 Field
类时定义错误消息和验证规则
binary_string = forms.CharField(error_messages={'invalid_number': 'not binary number'},
validators=[validate_binary])
如果只是简单的正则表达式验证,可以用 RegexField
简写为
binary_string = forms.CharField(regex=r'^[01]+$', error_message='not binary number')
注意 error_message
没有 s
,这个参数是一个字符串代替了 errors_message
中 invalid
的值
上面提到的方式很适合一些特殊规则。如果经常重复使用一些规则,自定义字段更加方便。如果只是简单的修改验证规则和信息,只需要继承并重写 default_error_messages
和 default_validators
即可
def validate_username(value):
if not re.search(r'^[a-z1-9_]+$'):
raise froms.ValidationError('', code='invalid_charactor')
class UsernameField(form.Field):
default_error_messages = {'invalid_charactor': 'invalid_charactor'}
default_validators = [validate_username]
Django 内建的 Field
并不多,经常无法满足需求。在扩展 Field
前先要了解的 Field
的工作方式
widget
获取数据,这个动作由 Form
来完成to_python
方法转换为 python 对象validate
执行验证,需要调用 Field
自身属性的验证规则写在此处run_validators
方法执行 default_validators
属性中的验证例1. 从 request.POST
中获取多条数字记录
class MultiWidget(forms.Widget):
def value_from_datadict(self, data, files, name):
try:
return data.getlist(name)
except AttributeError:
value = data.get(name, [])
if isinstance(value, (list, tuple)):
return list(value)
return [value]
class MultiIntegerField(forms.Field):
widget = MultiWidget
例2. 输入的值和指定的值匹配
class SelectCharField(forms.CharField):
def __init__(select, *args, **kwargs):
self.select = select
super(SelectCharField, self).__init__(*args, **kwargs)
def validate(self, value):
if value not in self.select:
raise forms.ValidationError('')