Generic Views

Разновидности view

При обращении к какому-нибудь URL специальный обработчик path() вызывает объект, передавая ему в качестве аргумента объект типа request, а на выходе ожидает объект типа response.
Вызываемым объектом может быть view-функция, но можно вызвать классы и их методы.
Объект, который можно вызывать, называют «исполняемый», callable.

Generic Views

Generic Views — это встроенные в Django view-классы, созданные для решения стандартных задач. В переводе Generic Views — это «общий вид» или «базовое представление». Популярные Generic Views:
На основе Generic Views создают классы-наследники: view-классы, обладающие свойствами и методами Generic Views; это классическое ООП в действии.

Связь модели, формы и view-класса

Модель — это класс для работы с ORM, посредник между кодом и базой данных. Для свойств модели указывают типы данных, и на основе модели можно создать форму, поля которой будут соответствовать свойствам модели.
Такая форма даст пользователю возможность добавлять или изменять записи в базе данных.
Создание форм на основе моделей:
  1. Создаётся (или выбирается существующая) модель.
  2. На основе модели создаётся класс формы.
  3. Объект формы (экземпляр, созданный на основе класса формы) передаётся в специальный view-класс.
  4. View-класс передаёт объект формы в шаблон, создаёт и возвращает пользователю страницу с веб-формой.
Для создания форм на основе моделей есть предустановленный класс ModelForm: от него можно наследовать классы для генерации форм.
Вот пример создания формы через ModelForm:
Скопировать кодPYTHON
from django.db import models from django.forms import ModelForm # создадим модель, в которой будем хранить данные формы class Book(models.Model): name = models.CharField(max_length=100) isbn = models.CharField(max_length=100) pages = models.IntegerField(min_value=1) class BookForm(ModelForm): class Meta: # эта форма будет работать с моделью Book model = Book # на странице формы будут отображаться поля 'name', 'isbn' и `pages` fields = ['name', 'isbn', 'pages']
Создана модель Book. Следом за ней описан класс формы BookForm, он наследуется от ModelForm.
В BookForm создан конфигурационный блок class Meta, в нём указана модель, на основе которой должна быть создана форма BookForm: model = Book.
У модели Book есть три свойства, два из которых принимают строку, а третье — число. Поэтому HTML-форма будет иметь поля того же типа, и мы ожидаем, что она будет примерно такой
image
Теперь надо вывести эту форму на страницу: передать её во view-функцию или view-класс. Это стандартная задача, и её тоже упростили: в Django для этого есть отдельный Generic View CreateView.
Скопировать кодPYTHON
from django.views.generic import CreateView class BookView(CreateView): form_class = BookForm success_url = "/thankyou" # куда переадресовать пользователя после успешной отправки формы template_name = "new_book.html"
В HTML-шаблон передаётся переменная form:
new_book.html
Скопировать кодSHELL
<form method="post"> {% csrf_token %} {{ form.as_p }} <input type="submit" value="Отправить"> </form>
urls.py
Скопировать кодPYTHON
# теперь из файла urls.py для пути new_book/ # можно вызвать метод as_view() класса BookView # этот метод унаследован классом BookView от родителя urlpatterns = [ # ... path("new_book/", views.BookView.as_view(), name="new_book") ]
Данные, введённые пользователем в форму, после отправки пройдут примерно такой путь:
HTML-форма → класс формы → модель → ORM → БД
Готово: в базу данных можно добавлять новые записи со страницы сайта.
База книг и форма для её заполнения в проекте Yatube не нужны, так что в следующем уроке вы создадите форму для регистрации пользователей: принципы всё те же, а пользы больше.