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

еделил некоторые формы 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)

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

Есть ли способ сделать это? Благодарю.

Ответы на вопрос(5)

Ваш ответ на вопрос