Форум сайта python.su
Первый вариант все же будет лучше. Всего две строки нужно будет. А ловить error в другом валидаторе не есть труЪ, как по-мне.
wtforms-alchemy предложил, чтобы не городить свои костыли для проверки уникальности. Проще в разы если форма собирается по таблице из базы.
P.S. Покопался в исходниках wtform-alchemy. Ссылка на wtforms_components из которого благополучно выпилили IPAddressField при этом в документации оно еще фигурирует. Просто супер.
Офлайн
А в чем проблема унаследоваться от IPAddress, перекрыть метод __call__, в нем сначала вызвать родительский, после выполнить свои проверки?
Офлайн
Это будет новый валидатор. Я посоветовал это в первом своем посте. Посмотреть как пишутся валидаторы и написать свой. Если нужен поверх стандартного валиадатора еще дополнительные проверки то да, наследуем от базового и переопределяем __call__ или __init__, что зависит от задачи. Хотя это и не очень элегантно, делать в одном валидаторе несколько проверок. Лучше выбросить StopValidation, чтобы идущий за ним валдатор не выполнял проверку.
Отредактировано 4kpt_III (Дек. 17, 2015 16:53:56)
Офлайн
Спасибо за ответы, мне пока всё-таки больше симпатичен вариант с проверкой errors. Создавать свой валидатор более громоздко и менее читабельно на мой взгляд, да и, действительно, зачем смешивать несколько проверок в одном валидаторе. Варинт со StopValidation еще менее рациональный, гораздо проще добавить в кастомный валидатор проверку на field.errors, чем специально для каждого валидатора перепопределять метод call.
Офлайн
А зачем для каждого? Только для того, на котором проверка должна обрубаться. Если там не IP зачем проверять дальше? Например, в Required ставится отсечка. А вот проверять, что накидали предыдущие валидаторы в новом валидаторе вообще не есть гуд. Потому как это противоречит логике построения “валидационной цепочки”, т.е. вы делаете код, который другие могут и не понять. Ну а насчет громоздкости это будет не менее громоздким, чем написать несколько строк, которые вызовут super метод для нового валидатора и если он выдаст ValidationError выдадут StopValidation.
Это будет громоздко???
class OnlyIPAddress(IPAddress): def __call__(self, **kwargs): try: super(OnlyIPAddress, self).__call__(**kwargs) except ValidationError: raise StopValidation
Отредактировано 4kpt_III (Дек. 18, 2015 12:38:59)
Офлайн