LINUX.ORG.RU

[django] валидация форм

 


0

0

Как лучше форму валидировать? Задать для каждого поля в моделе validator_list(что, вроде, depricated) или лучше переопределить validate? Например, так:

def validate(self):
    result = super(__class__, self).validate()

    if not result:
        result = self.my_validation_function()

    return result
★★★★★

В идеале к любой форме нужно просто приложить список ассертов. Ну, что-нить типа:

{ "title=='' => Заголовок не может быть пустым",
  "section_id==0 => Вы не выбрали раздел",
  ...
}

Правда, как это в Django сделать не знаю, не возился :)

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

как ты мог подумать что я не читал djangobook? :).

В коробке того что мне нужно нет. Например, models.EmailField не проверяет существует ли реально почтовый домен итп(про django.core.validators тоже знаю). В общем, силами django тут не управится.

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

> как ты мог подумать что я не читал djangobook? :).

Вопрос слишком уж абстрактно сформулирован. Вот я и подумал...

> Например, models.EmailField не проверяет существует ли реально
> почтовый домен итп(про django.core.validators тоже знаю). В общем,
> силами django тут не управится.

Тогда берем тупо пример из той же Джанго-книги, прям из раздела,
который я указал:

class MyForm(forms.Form):
    # ...
    email = forms.EmailField(label=u"e-mail")

    def clean_email(self):
        email = self.clean_data.get('email', '')
        if not real_domain(email):
            raise forms.ValidationError("Domain is not real")
        return email

Естессно, в функцию real_domain запихиваем весь функционал проверки,
который может и не быть частью Django (хотя хз, может и такая проверка
есть, я уже ничему не удивляюсь).

eugine_kosenko ★★★
()

Джангобук уже несколько устарела.

validate() были недавно вырезаны из транка, validator_list будет скоро вырезан. Новая реализация валидации моделей будет после 1.0

Для валидации полей форм нужно использовать clean_*() функции. Пр это читаем в документации: http://www.djangoproject.com/documentation/forms/#custom-form-and-field-valid...

anonymous
()
Ответ на: комментарий от eugine_kosenko

> Тогда берем тупо пример из той же Джанго-книги, прям из раздела, который я указал:

Оно служит, скорее, для нормализации данных в форме, как мне кажется. Но всё равно спасибо. Думаю сделать через validators_list т.к. упоминаний о практике переопределения validate() вообще не нашёл.

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

понял, тогда тут выбора нет, буду делать как девелоперы советуют, т.е. через clean_*()

> Джангобук уже несколько устарела.

ага, и достаточно прилично :(. И почему-то не спешат обновлять её хотя у них на багтраке народ исправно пишет что где в книжке не так.

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

Не спешат обновлять, т.к. все силы были брошены на доводку релиза 1.0, который ожидается через пару недель. Кроме того, джангобук ИМХО как-то и не нужен. Официальная документация джанги всегда up-to-date и всегда отвечает на все вопросы: http://docs.djangoproject.com/

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

> И почему-то не спешат обновлять её хотя у них на багтраке народ исправно пишет что где в книжке не так.

Там даже я отличился :-).

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

> Кроме того, джангобук ИМХО как-то и не нужен. Официальная документация джанги всегда up-to-date и всегда отвечает на все вопросы: http://docs.djangoproject.com/

Ну, для меня Джанго-книга хороша как учебник и сборник рецептов "на скорую руку" :-). В отличие от руководства, которое носит скорее справочный характер.

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

> В отличие от руководства, которое носит скорее справочный характер.

+1, тока после книги понял что к чему. Туториалы ихние неплохие, но, как оно работает, по ним понять можно тока если до этого работал с другими MVC-фреймворками. Да и там местами тема раскрыта лучше чем в доках.

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

Я запутался :(. Почему именно форма проверяет валидность данных а не 
модель которую эта форма описывает? У меня форма сделана вот так:
class MyForm(ModelForm)

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

> Почему именно форма проверяет валидность данных а не модель которую эта форма описывает?

Например у модели могут быть вычисляемые поля. Вобщем-то модель - это данные. А вот форма - это способ ввода и валидации данных. Так что IMHO форма и должна проверять и при необходимости преобразовывать данные.

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

> Вобщем-то модель - это данные

а мне казалось что модель это именно самостоятельная сущность которая дёргается через контроллер, не? Т.е. не как структура а именно как объект с методами "сохрани своё состояние в базу", "сделай то-то", итп. А форма это просто средство заполнения данных в модель. И, как простое средство, должно содержать минимум кода чтобы, если что, не пришлось править и модель и форму. Или я неправильно понял суть MTV?

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

Валидация модели в базе данных и валидация html-форм совершенно разные вещи, и, в общем случае, не связанные друг с другом (ModelForm - лишь шорткат для создания формы с полями от модели).

Для них могут требоваться разные проверки (например форма не должна проверять unique ограничение, а модель не должна проверять, что пароль и его подтверждение одинаковые).

Валидация форм хорошо описана в документации и блогах (clean(), clean_*()).

Джанго никогда не имел валидации на уровне моделей (validation_list был всего лишь способом заполнить old-forms специфичными проверками). Она все еще не реализована и сейчас. Есть тикет с патчами, реализующими данную функциональность: http://code.djangoproject.com/ticket/6845

Но по ряду причин этот патч будут обкатывать после релиза 1.0.

В данный момент официальный способ: проводить валидацию моделей через валидацию форм http://groups.google.com/group/django-developers/browse_thread/thread/becf627...

Пока выход только такой. В релизе 1.1 будет раздельная валидация форм и моделей.

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

> Валидация модели в базе данных и валидация html-форм совершенно разные вещи

Спасибо, это именно то что я хотел услышать. Мне это важно потому что я хотел django использовать не только в вебе, но и в составе коплексных проектов. Естественно, тут валидацию бы на уровне модели т.к. какие, нафиг, формы в скрипте который ничего никуда не выводит.

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

> Естественно, тут валидацию бы на уровне модели т.к. какие, нафиг, формы в скрипте который ничего никуда не выводит. 

В вашем случае как раз можно (временно, до релиза 1.1) пользоваться официальным хаком,
ведь ModelForm необязательно берет данные из request.POST.

Создайте ModelForm с нужными полями и валидацией.
Передайте ей не данные из request.POST, а instance и вызовите is_valid().

Примерно так:

class MyForm(ModelForm):
    # Тут валидация специфичных для модели вещей в clean_*() методах

def view(request):
    model = MyModel()
    if MyForm(instance=model).is_valid():
        # Наша моделька валидная делаем что-то

Конечно некрасиво, но пока что выбора нет.

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

> Конечно некрасиво, но пока что выбора нет.

не, об этом я думал, это слишком ужасно по моим меркам.

Теперь я понял, не готова django в серьёзный продакшн(имхо). Чую, если щас мутить большой проект то его каждые пол года переписывать придётся.

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

> Теперь я понял, не готова django в серьёзный продакшн

Google, Яндекс, Lawrence Journal-World, Washington Post, Pownce и др. с вами явно не согласны.

> его каждые пол года переписывать придётся

Странная практика переписывания каждые пол-года. Реализовали проект на, скажем, текущем SVN-срезе и заморозили. Зачем переписывать? Или вам за переписывание уже имеющейся функциональности дополнительную зарплату платят?

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

> Google, Яндекс, Lawrence Journal-World, Washington Post, Pownce и др. с вами явно не согласны.

Иван Сагалаев говорил что есть две версии django: старая и нестабильная :)

> Реализовали проект на, скажем, текущем SVN-срезе и заморозили. Зачем переписывать?

а потом появится новая django и после обновления всё перестаёт работать. Это вопрос стабильности API. Можно и не обновлять, но для этого надо чтобы появилась хотя бы одна стабильная ветка с нужным функционалом.

Всё вышесказанное это моё мнение. Было предложено четыре метода решения моей проблемы, три из них deprecated, а тот что предлагал я в первом посте unimplemented. Поэтому я решил что большие вещи делать опасно. Впрочем, альтернативы пока не вижу.

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