Я определил некоторые формы 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 '<Category %i>'% 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 следующим образом:
name = TextField(u'name', [validators.Required(), Unique(Category, Category.name)])
Эта проверка отлично работает, когда пользователь пытается добавить категорию, которая уже существует \ o /
НО не будет работать, когда пользователь пытается обновить существующую категорию (без изменения атрибута имени).
Если вы хотите обновить существующую категорию: создайте экземпляр формы с атрибутом категории для редактирования:
def category_update(category_id):
""" update the given category """
category = Category.query.get(category_id)
form = CategoryForm(request.form, category)
Основная проблема в том, что я не знаю, как получить доступ к существующему объекту категории в валидаторе, что позволило бы мне исключить отредактированный объект из запроса.
Есть ли способ сделать это? Спасибо.