Файлы
practice
migrations
0002_contact.py
__init__.py
0001_initial.py
templates
index.html
models.py
__init__.py
apps.py
forms.py
admin.py
tests.py
views.py
task32admin
__init__.py
settings.py
urls.py
wsgi.py
manage.py
models.py
Урок 5: Generic Views, модели и формы
Вам дана модель Contact в файле models.py. На её основе создайте форму для отправки сообщений администратору сайта.
Поля формы должны быть такими:
  • Имя (name)
  • Адрес электронной почты для связи (email)
  • Тема сообщения (subject)
  • Текст сообщения (body)
Браузер808x969
Браузер808x969

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, посредник между кодом и базой данных. Для свойств модели указывают типы данных, и на основе модели можно создать форму, поля которой будут соответствовать свойствам модели.
Такая форма даст пользователю возможность добавлять или изменять записи в базе данных.
Создание форм на основе моделей:
  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 не нужны, так что в следующем уроке вы создадите форму для регистрации пользователей: принципы всё те же, а пользы больше.
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Новый файл
Новая папка
Удалить папку
Переименовать
Удалить файл
Переименовать
Новый файл
Новая папка
Удалить папку
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Новый файл
Новая папка
Удалить папку
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Удалить файл
Переименовать
Новый файл
Новая папка
Удалить папку
Переименовать
Удалить файл
Новый файл
Новая папка