Nov 27, 2011
|
Продолжение статьи готовим Pylons + WTForms. Рассмотрим как создать свой класс для валидации. Здесь можно найти стандартные валидаторы http://wtforms.simplecodes.com/docs/0.6/validators.html
Добавим файл equipments.py
в папку validators
:
|~forms/
| |~mycontrollers/
| | |-__init__.py
| | `-equipments.py
| |~validators/
| | |-__init__.py
| | `-equipments.py
| `-__init__.py
Напишем валидатор IP адресов, вообще в WTForm есть класс
wtforms.validators.IPAddress
, но он работает только с IPv4 адресами
(на момент написания статьи).
import ipaddr
from wtforms.validators import ValidationError
class IPNetwork(object):
"""
Validates an IP(v4 and v6) address.
:param message:
Error message to raise in case of a validation error.
"""
def __init__(self, message=None):
self.message = message
def __call__(self, form, field):
data = field.data
# Use PEP3144 for validation
if not ipaddr.IPNetwork(data) and data:
self.message = field.gettext(u'Invalid IP address.')
raise ValidationError(self.message)
Сначала получаем значение поля, а потом при помощи модуля ipaddr проверяем. Если проверка не проходит то
генерируем исключение ValidationError
. Теперь напишем похожий валидатор для
MAC адреса.
...
from wtforms.validators import Regexp
...
class MACAddress(Regexp):
"""
Validates an MAC address.
:param message:
Error message to raise in case of a validation error.
"""
def __init__(self, message=None):
super(MACAddress, self).__init__(r'^([a-f\d]{1,2}\:){5}[a-f\d]{1,2}$',\
message=message)
def __call__(self, form, field):
if self.message is None:
self.message = field.gettext(u'Invalid MAC address.')
if field.data:
super(MACAddress, self).__call__(form, field)
Здесь мы использовали встроенный класс Regexp
. В
файле формы это используется так:
...
from myapp.forms.validators.mycontroller import IPNetwork, MACAddress
...
class EditForm(Form):
ip = TextField('IP address', [IPNetwork()])
mac = TextField('MAC address', [MACAddress()])