LINUX.ORG.RU

Django валидация формы по двум или более полям.

 , ,


0

1

Как в джанге правильно делать валидацию по двум полям?

Допустим у меня есть два поля: id и tехt. Как проверить, что бы к примеру при id = 15 text должен быть `111`. При чем данные формы реально не корректные, т.е. пользователь сам никак не может их ввести в форму (только подделать).

Есть 2 варианта...

Переопределять метод clean()[причем все советуют иммено его] у всей формы. Но он пишет ошибки не к полям, а в спец поле `__all__`. Для меня это бред. Плюс к этому я не понял как его использовать. Метод формы is_valid() его не вызывает почему-то, хотя вроде как должен.

Использовать `field_order` при инициализации формы и дальше делать то, что мне нужно в методе validate() у нужного поля. Не уверен будут ли отрабатывать валидаторы по-умолчанию, если я переопределю этот метод. Более того, если нужна будет валидация по трем полям, то этот метод не уже годиться.

Как ты валидируешь два или более поля, %username%?

Переопределять метод clean()[причем все советуют иммено его] у всей формы. Но он пишет ошибки не к полям, а в спец поле `__all__`.

А ты куда хочешь писать ошибку? К обоим полям, к случайному из них?

vurdalak ★★★★★ ()

Метод формы is_valid() его не вызывает почему-то, хотя вроде как должен.

Ты не мог что-нить переопределить в классе и не вызвать родную функцию?

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Конечно мог. Я убил на это целых 2 часа на прошлой неделе... и вроде написано... и вроде должно работать... и вроде уже в сорцы джанги полез. Сегодня пришел, плюнул сделал git reset и решил сперва спросить =)

Причем на SO есть подобные вопросы про неработающий clean() у формы, но нормальных ответов увы.

Я почти дословно скопипастил вот это https://docs.djangoproject.com/en/1.9/ref/forms/validation/#cleaning-and-vali...

greek_31 ★★ ()
Последнее исправление: greek_31 (всего исправлений: 3)
Ответ на: комментарий от greek_31

Опа. А если привязываться к validate() на поле, то я не смогу же получить значние из другого поля.

Получается остается только clean() у формы.

greek_31 ★★ ()
Последнее исправление: greek_31 (всего исправлений: 1)

А что мешает для этой формы написать специализированную процедуру довалидации?
Что-то типа такого:

class form(Forms.form):
    def is_id_vs_text_valid(self):
        do_whatever
        return something


И потом:
my_form = form(request.POST or None)
if my_form.is_valid() and form.is_id_vs_text_valid():
    pass

Goury ★★★★★ ()
Ответ на: комментарий от Goury

В принципе хороших, годный вариант. Просто можно забыть если форму использовать в нескольких местах (не мой кейс).

greek_31 ★★ ()
Ответ на: комментарий от greek_31

ну передёрни у неё is_valid что ли для большей надёжности и допиши туда после супера дополнительных вычислений

Goury ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.