Generic Views
Разновидности view
При обращении к какому-нибудь URL специальный обработчик path() вызывает объект, передавая ему в качестве аргумента объект типа request, а на выходе ожидает объект типа response.
Вызываемым объектом может быть view-функция, но можно вызвать классы и их методы.
- View-функция — такие функции называют ещё «функции представления» (от слова "view") или просто «представление». Это самый простой тип view-объектов. Функция получает на вход стандартный объект
request и возвращает объект типа response. Объекты response могут быть созданы встроенными функциями-помощниками, например, функцией render().
Вызов view-функции: path('view/', my_view) - Class-based view — по аналогии название можно перевести как «представление, основанное на классе» или «представление-класс». Мы будем использовать термин «view-класс». Такой класс должен наследоваться от специальных родительских классов Generic Views.
Из файлов urls.py можно вызывать метод view-класса
as_view().
Вызов метода view-класса: path('view/', ClassName.as_view())
Объект, который можно вызывать, называют «исполняемый», callable.
Generic Views
Generic Views — это встроенные в Django view-классы, созданные для решения стандартных задач. В переводе Generic Views — это «общий вид» или «базовое представление».
Популярные Generic Views:
- FormView обрабатывает формы на основе моделей.
- TemplateView упрощает вывод данных в шаблон.
- CreateView связывает модель и пользовательскую веб-форму, предназначенную для создания новой записи в базе.
На основе Generic Views создают классы-наследники: view-классы, обладающие свойствами и методами Generic Views; это классическое ООП в действии.
Связь модели, формы и view-класса
Модель — это класс для работы с ORM, посредник между кодом и базой данных. Для свойств модели указывают типы данных, и на основе модели можно создать форму, поля которой будут соответствовать свойствам модели.
Такая форма даст пользователю возможность добавлять или изменять записи в базе данных.
Создание форм на основе моделей:
- Создаётся (или выбирается существующая) модель.
- На основе модели создаётся класс формы.
- Объект формы (экземпляр, созданный на основе класса формы) передаётся в специальный view-класс.
- 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:
model = Book
fields = ['name', 'isbn', 'pages']
Создана модель Book.
Следом за ней описан класс формы BookForm, он наследуется от ModelForm.
В BookForm создан конфигурационный блок class Meta, в нём указана модель, на основе которой должна быть создана форма BookForm: model = Book.
У модели Book есть три свойства, два из которых принимают строку, а третье — число. Поэтому HTML-форма будет иметь поля того же типа, и мы ожидаем, что она будет примерно такой
Теперь надо вывести эту форму на страницу: передать её во 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
urlpatterns = [
path("new_book/", views.BookView.as_view(), name="new_book")
]
Данные, введённые пользователем в форму, после отправки пройдут примерно такой путь:
HTML-форма → класс формы → модель → ORM → БД
Готово: в базу данных можно добавлять новые записи со страницы сайта.
База книг и форма для её заполнения в проекте Yatube не нужны, так что в следующем уроке вы создадите форму для регистрации пользователей: принципы всё те же, а пользы больше.