Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 17, 2015 14:24:03

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Свой валидатор в wtforms, flask

Первый вариант все же будет лучше. Всего две строки нужно будет. А ловить error в другом валидаторе не есть труЪ, как по-мне.

wtforms-alchemy предложил, чтобы не городить свои костыли для проверки уникальности. Проще в разы если форма собирается по таблице из базы.

P.S. Покопался в исходниках wtform-alchemy. Ссылка на wtforms_components из которого благополучно выпилили IPAddressField при этом в документации оно еще фигурирует. Просто супер.

Офлайн

#2 Дек. 17, 2015 16:30:46

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Свой валидатор в wtforms, flask

А в чем проблема унаследоваться от IPAddress, перекрыть метод __call__, в нем сначала вызвать родительский, после выполнить свои проверки?



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

Офлайн

#3 Дек. 17, 2015 16:51:14

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Свой валидатор в wtforms, flask

Это будет новый валидатор. Я посоветовал это в первом своем посте. Посмотреть как пишутся валидаторы и написать свой. Если нужен поверх стандартного валиадатора еще дополнительные проверки то да, наследуем от базового и переопределяем __call__ или __init__, что зависит от задачи. Хотя это и не очень элегантно, делать в одном валидаторе несколько проверок. Лучше выбросить StopValidation, чтобы идущий за ним валдатор не выполнял проверку.

Отредактировано 4kpt_III (Дек. 17, 2015 16:53:56)

Офлайн

#4 Дек. 18, 2015 06:33:58

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Свой валидатор в wtforms, flask

Спасибо за ответы, мне пока всё-таки больше симпатичен вариант с проверкой errors. Создавать свой валидатор более громоздко и менее читабельно на мой взгляд, да и, действительно, зачем смешивать несколько проверок в одном валидаторе. Варинт со StopValidation еще менее рациональный, гораздо проще добавить в кастомный валидатор проверку на field.errors, чем специально для каждого валидатора перепопределять метод call.



Офлайн

#5 Дек. 18, 2015 12:30:19

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Свой валидатор в wtforms, flask

А зачем для каждого? Только для того, на котором проверка должна обрубаться. Если там не IP зачем проверять дальше? Например, в Required ставится отсечка. А вот проверять, что накидали предыдущие валидаторы в новом валидаторе вообще не есть гуд. Потому как это противоречит логике построения “валидационной цепочки”, т.е. вы делаете код, который другие могут и не понять. Ну а насчет громоздкости это будет не менее громоздким, чем написать несколько строк, которые вызовут super метод для нового валидатора и если он выдаст ValidationError выдадут StopValidation.

Это будет громоздко???

class OnlyIPAddress(IPAddress):
    def __call__(self, **kwargs):
        try:
            super(OnlyIPAddress, self).__call__(**kwargs)
        except ValidationError:
            raise StopValidation

P.S. А городить проверку уникальности на 7 строк, которая и так есть в wtforms-alchemy да еще внутри создания формы не громоздко??? Не ломайте естественную логику работы валидаторов, мой Вам совет.

Отредактировано 4kpt_III (Дек. 18, 2015 12:38:59)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version