Уникальный валидатор в WTForms с моделями SQLAlchemy

Я определил некоторые формы WTForms в приложении, которое использует SQLALchemy для управления операциями с базой данных.

Для Например, форма для управления категориями:

class CategoryForm(Form):
    name = TextField(u'name', [validators.Required()])

А вот соответствующая модель SQLAlchemy:

class Category(Base):
    __tablename__= 'category'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(255))

    def __repr__(self):
        return ''% self.id

    def __unicode__(self):
        return self.name

Я хотел бы добавить уникальное ограничение для проверки формы (не для самой модели).

Прочитав документацию WTForms , я нашел способ сделать это с помощью простого класса:

class Unique(object):
    """ validator that checks field uniqueness """
    def __init__(self, model, field, message=None):
        self.model = model
        self.field = field
        if not message:
            message = u'this element already exists'
        self.message = message

    def __call__(self, form, field):         
        check = self.model.query.filter(self.field == field.data).first()
        if check:
            raise ValidationError(self.message)

Теперь я могу добавить этот валидатор в CategoryForm следующим образом: НО это не сработает, когда пользователь пытается обновить существующую категорию (без изменения атрибута имени).

Если вы хотите обновить существующую категорию: вы создать экземпляр формы с атрибутом категории для редактирования:

def category_update(category_id):
    """ update the given category """
    category = Category.query.get(category_id)
    form = CategoryForm(request.form, category)

Основная проблема в том, что я не знаю, как получить доступ к существующему объекту категории в валидаторе, который позволил бы мне исключить редактируемый объект из запроса.

Есть ли способ сделать это? Спасибо.

13
задан bool.dev 18 February 2013 в 14:20
поделиться