[БЕЗ_ЗВУКА]
[БЕЗ_ЗВУКА] В
этом видео мы с вами познакомимся с одним из стандартных механизмов Django,
так называемым классом Forms, попробуем сделать все те же задачи,
что мы делали с вами ранее вручную, мы попробуем сделать с помощью этого класса.
Итак, для начала создадим файл Forms.py нашим приложением formdummy.
[БЕЗ_ЗВУКА] Итак,
импортируем из
Django.forms наши
формы.
Создадим класс формы,
назовем ее
DummyForm от наследуемого класса Form.
И теперь мы должны описать поля, которые у нас будут в этой форме.
Как мы помним, их у нас три: это текст отзыва,
оценка и, соответственно, изображение.
Итак, поля описываются примерно, как и модели, через переменные класса.
Назовем переменную text = forms.
Для текста у нас есть специальное поле CharField,
мы указываем label для этого поля.
Назовем его Отзыв и указываем
параметр max_length, который, как мы помним,
ограничивает максимальную длину.
Ограничиваем ее по-прежнему десятью символами, минимальную длину по-прежнему
ограничиваем тремя.
Давайте попробуем запустить эту
форму пока с одним полем для того,
чтобы ее… Вообще class form можно отрендерить в HTML.
Для того чтобы это сделать, нам необходимо импортировать в наш View нашу форму,
import DummyForm.
Теперь мы инициализируем нашу форму,
передаем ее в контекст,
[БЕЗ_ЗВУКА] и в
нашем шаблоне мы должны
ее поставить на место, скажем так.
Объект Form рендерится не в полную форму с тегом form,
а рендерится непосредственно только input,
и поэтому мы закомментируем эти инпуты,
вместо них поставим форму.
Итак, давайте попробуем, что получилось,
пишется нам ошибка.
Да, мы неправильно сделали.
Сейчас мы поменяем импорты, ничего страшного,
все иногда ошибаются.
Итак, forms.Form field.
Теперь больше похоже на правду.
Давайте посмотрим,
у нас вот здесь опечатка,
перезапускаем наш сервер, вроде теперь всё нормально.
Так, давайте попробуем загрузить.
Итак, мы видим, что у нас отобразилась форма с одним элементом.
Теперь давайте добавим оставшиеся.
Как мы помним, это у нас поле grade.
Поле grade у нас является целым числом,
поэтому поле IntegerField,
название Оценка и, соответственно,
параметры для ограничения min_value и
max_value.
Соответственно, как мы помним, от 1 до 100.
И также у нас еще есть image файл,
соответственно это поле FileField,
label фотография,
[БЕЗ_ЗВУКА] и
давайте попробуем, посмотрим, что у нас получилось.
Так, в forms опечатка.
Итак, давайте загрузим нашу форму.
Как мы видим, у нас получилось ровно то же, что и в прошлый раз.
Давайте попробуем заполнить нашу форму.
Проверим, что всё у нас по-прежнему работает.
Как мы видим, всё по-прежнему работает,
по-прежнему видим то, что нам было прислано.
Но это еще не всё.
Помимо того, что мы можем очень просто рендерить форму,
мы можем еще осуществлять валидацию этой формы достаточно простым способом.
Для этого нам нужно заполнить нашу
форму следующим образом,
POST.
Таким образом, данные из POST запроса попадут непосредственно в форму.
Нам достаточно будет проверить, является ли форма валидной.
Если она является,
то мы можем отрендерить тот шаблон, который у нас уже и так был с
данными context.
При этом context у нас будет заполняться уже из формы.
[БЕЗ_ЗВУКА] Если
же форма не проходит валидацию,
то мы отобразим некий шаблон с ошибкой.
Давайте создадим
отдельный шаблон error HTML, где крупными буквами напишем Ошибка.
Так, копируем то, что у нас уже есть,
создаем новый файл, сохраняем его, называем errorhtml.
Пишем здесь
большими буквами Ошибка.
[БЕЗ_ЗВУКА] Итак,
давайте проверим, что у нас получилось,
работает ли это всё или нет,
может быть, мы где-нибудь ошиблись.
Так, заполняем в очередной раз наш отзыв.
Как видим, есть ошибка.
[БЕЗ_ЗВУКА] Да,
здесь у нас должен быть пустой словарь, хотя нет,
здесь должен быть не пустой словарь,
здесь мы пробросим наши ошибки в context.
[БЕЗ_ЗВУКА] Итак,
отправляем форму еще раз,
[БЕЗ_ЗВУКА] натыкаемся на очередную опечатку.
Итак, мы с вами создали форму, создали все
три поля в ней, она у нас валидно отображается.
Давайте попробуем отправить только отзыв и оценку.
Как видим, у нас поле с
фотографией стало обязательным, хотя такого эффекта мы не ожидали.
Это всё потому,
что в поле Forms каждое из описанных полей является по умолчанию обязательным.
Давайте поле Фотография сделаем необязательным.
Для этого нужно параметру required установить значение False.
Давайте посмотрим, что у нас получится теперь.
Перезагрузим форму,
установим значение и осуществим отправку.
Как видим, отправка была успешно осуществлена.
Давайте попробуем сделать так,
чтобы наша форма была невалидной.
Для этого давайте опишем новое правило валидации на стороне
сервера для поля text.
Делается это следующим образом.
Мы описываем метод clean_text и ожидаем,
что в нашем поле clean_text есть значение,
например, abc.
not in
self.cleaned data
['text'] raise
forms ValidationError,
что означает ошибка валидации формы.
Напишем сопровождающее сообщение,
например: Вы не о том пишете.
Так, давайте попробуем спровоцировать отказ формы.
Возвращаемся на нашу форму, пишем наш отзыв.
Как видим, букв abc здесь нет, поэтому должен быть спровоцирован отказ.
Нажимаем Отправить запрос, и, как видим,
отображается наш шаблон с ошибкой.
Мы с вами научились использовать Django Form,
также научились делать дополнительную валидацию на серверной стороне.
Мы не затронули в этом видео вопросы касательно виджетов и Initial Data формы.
Но это вы можете почерпнуть из дополнительных материалов.
В следующих видео мы разберем с вами серверную валидацию другими способами,
а именно использованием пакета jsonschema и marshmallow.
[ЗВУК] [БЕЗ_ЗВУКА]