Nov 27, 2011

WTForm валидация

Продолжение статьи готовим 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()])
../../../_images/wtforms_validation.png

WTForm валидация


Comments

comments powered by Disqus