Выкапывание видов на основе Django Class (3 части серии)
Этот пост был первоначально опубликован на Цифровой кот
В первых двух вопросах этой короткой серии мы обсудили основные концепции просмотров на основе классовых представлений в Django, и начали понимание и использование двух основных общих обзоров Django позволяет вам: Посмотреть список
и DetailView.
. Оба взгляда, которые прочитают некоторые данные из базы данных и показывают их на представленном шаблоне. Мы также кратко рассмотрели базовые представления, которые позволяют нам построить индивидуальные представления и представления на основе даты.
Этот третий выпуск представит читатель на классовую версию форм Django. Этот пост не предназначен для полного введения в библиотеку формы Django; Скорее, я хочу показать, как базирующиеся классовые общие взгляды реализуют CUD часть операций CRUD (создать, чтение, обновление, удаление), прочитанного, реализованного «стандартными» родовыми представлениями.
Чтобы начать работу с CBFS (классовые формы) Давайте рассмотрим простой пример. У нас есть Stickynote
Класс, который представляет собой простое текстовое примечание с датой:
class StickyNote(models.Model): timestamp = models.DateTimeField() text = models.TextField(blank=True, null=True)
Одна из первых вещей, которые мы обычно хотим сделать, это создать форму, которая позволяет пользователю создавать новую запись в базе данных, в этом случае новая заметка. Мы можем создать страницу, которая позволяет нам вводить данные для нового Stickynote
Просто создать следующий вид
class NoteAdd(CreateView): model = StickyNote
Не удивительно, что класс в основном пуст. Благодаря наследству, как это произошло в первых двух постах со стандартными представлениями, класс содержит кучу кода, который живет где-то в иерархии класса и работает за кулисами. Наша миссия сейчас, чтобы раскрыть этот код, чтобы выяснить, насколько именно работает CBFS и как мы можем изменить их, чтобы выполнить то, что нам нужно.
Чтобы упростить последующее значение, пожалуйста, всегда помните, что «классовая форма» – это короткое имя для «вида формы на основе класса». То есть CBFS – это представления, поэтому их работа состоит в том, чтобы обработать входящие HTTP-запросы и вернуть HTTP-ответ. Виды формы делают это немного по-другому, чем стандартные, в основном благодаря различным природе запросов пост по сравнению с полученными. Давайте посмотрим на эту концепцию, прежде чем двигаться дальше.
Обратите внимание, что это широкая тема, и что настоящий раздел хочет быть очень быстрым обзором основных концепций, связанных с Django CBFS
HTTP-запросы приходят в разных формах, в зависимости от Метод они несут. Эти методы называются HTTP глагол и два самых используемых – Получить и ПОЧТА . Способ получения сообщает серверу, что клиент хочет получить ресурс (тот, который связан с относительным URL) и не должен иметь побочных эффектов (таких как изменение ресурса). Метод Post используется для отправки некоторых данных на сервер, заданный URL, являющийся ресурсом, который должен обрабатывать данные.
Как видите, определение поста очень широкое: сервер принимает входящие данные и разрешено выполнять любые виды действия с ним, например, создание нового объекта, редактирования или удаления одного или нескольких из них и так далее Отказ
Имейте в виду, что формы не то же самое, что пост запрос. На самом деле, они соединяются только что кстати: форма – это способ собирать данные из пользователя, просматривающего HTML-страницу, в то время как почтовые запросы так, как данные передаются на сервер. Вам не нужно иметь форму, чтобы сделать запрос на почту, вам просто нужны некоторые данные для отправки. Формы HTML – это просто полезный способ отправить почтовые запросы, но не единственный.
Почему виды формы отличаются от стандартных просмотров? Ответ можно найти, глядя на поток типичных данных представления данных на веб-сайте:
- Пользователь просматривает веб-страницу (Get)
- Сервер отвечает на запрос GET со страницей, содержащей форму
- Пользователь заполняет форму и представляет его (пост)
- Сервер получает и обрабатывает данные
Как вы можете видеть, что процедура включает в себя двойное взаимодействие с сервером: первый запрос получает страницу, второй посты данных. Таким образом, вам нужно построить представление, которое отвечает на запрос GET и представление, которое отвечает на пост.
Поскольку большую часть времени URL-адрес, который мы используем для публикации данных, является тем же URL, который мы использовали для получения страницы, нам нужно создать представление, которое принимает оба метода. Настало время копаться в формах на основе классовых форм, которые Django предоставляет понять, как они имеют дело с этим двойным взаимодействием.
Давайте начнем с Createview
Класс, который мы использовали в нашем простом примере ( Код . Это почти пустой класс, который наследует от OmityObjectTemplaterPonsemixin
и Basecreateview.
. Первый класс имеет дело с шаблоном, выбранным для рендеринга ответа, и мы можем оставить его в сторону на данный момент. Второй класс ( Код ), с другой стороны, это тот, который мы сейчас заинтересованы, так как он реализует два метода, имена, которые могут объяснить, Получить
и пост
Отказ
Мы уже встречались Получить
Метод в предыдущей статье, когда мы говорили о отправка
Метод Вид
класс. Быстрый отвод его цели: этот метод является использование для обработки входящего HTTP-запроса и называется, когда метод HTTP получит. Неудивительно, что пост
Метод называется, когда входящий запрос представляет собой сообщение. Два метода уже определены предком Basecreateview
класс, а именно ProcessFormView
( Код ), так полезно взглянуть на исходный код этого последнего класса:
class ProcessFormView(View): """Render a form on GET and processes it on POST.""" def get(self, request, *args, **kwargs): """Handle GET requests: instantiate a blank version of the form.""" return self.render_to_response(self.get_context_data()) def post(self, request, *args, **kwargs): """ Handle POST requests: instantiate a form instance with the passed POST variables and then check if it's valid. """ form = self.get_form() if form.is_valid(): return self.form_valid(form) else: return self.form_invalid(form)
Как вы можете видеть, что два метода довольно просты, но ясно, что многое происходит под капотом.
Давайте начнем с Получить
, что, по-видимому, не делает многое. Это просто звонит Render_to_response
прохождение результата get_context_data.
Поэтому нам нужно отследить последнее, чтобы увидеть, что будет добраться шаблон. ProcessFormView
Или его предки не дают никакого метода под названием get_context_data
; вместо этого Basecreateview
Класс получает его от Модефланмиксин
, что, в свою очередь, получает его от FormMixin
( Код ).
Иерархия класса довольно сложна, но не бойся, важная часть состоит в том, что метод get_context_data
предоставлено FormMixin
впрыскивает «Форма»
Значение в контекст ( код ), а форма предоставляется get_form
Метод, определенный в одном классе ( Код ), и это в конечном итоге использует form_class
Атрибут для создания формы ( Код ). Как видите, есть много шагов, что означает множество шансов на настроить поведение, если нам нужно будет обеспечить персональное решение.
Интересно иметь еще более глубокий взгляд на механизм создания формы, хотя, поскольку это решающая точка всей разницы Get/Post. После того, как метод get_form
Получил класс формы, он создает его создание самой формы, и параметры, переданные классу, предоставляются get_form_kwargs
( Код ). Когда метод HTTP получен, get_form_kwargs
Возвращает словарь с Первоначальный
и префикс
Клавиши, которые взяты из атрибутов с тем же именами. Я не хочу слишком много подкопать в формах сейчас, так как они не вышли из объема поста, но если вы прочитаете определение Baseform
( Код ) Вы заметите, что его __init__
Метод принимает те же два атрибута Первоначальный
и префикс
Отказ Обратите внимание, что это упрощение всего процесса, как Модефланмиксин
класс вводит немного более сложной версии обоих get_form_class.
и get_form_kwargs
Обеспечить соглашения об именах, связанных с моделью Django в использовании.
Вернуться к ProcessFormView
, пост
Способ не представляет непосредственно шаблон, поскольку он должен обрабатывать входящие данные, прежде чем выполнить этот последний шаг. Метод, таким образом, звонки get_form
Прямо, а затем управляет процессом проверки на нем, звонив тогда либо form_valid
или form_invalid
в зависимости от результата теста. Смотрите Официальная документация Для получения дополнительной информации о проверке формы.
На этот раз get_form_kwargs
Добавляет две клавиши в форму, когда она создана, а именно данные
и Файлы
Отказ Они приходят прямо из Пост
и Файлы
Атрибуты запроса и содержат данные, которые пользователь отправляет на сервер.
Последнее, давайте посмотрим на form_valid
и form_invalid
Отказ Оба метода предоставляются FormMixin
( Код ), но первый дополнен Модефланмиксин
( Код ). Базовая версия form_invalid.
звонки Render_to_response
Передача данных контекста инициализирована с самой формой. Таким образом, можно заполнить шаблон с значениями формы и сообщения об ошибках для неправильных, пока form_valid
В своей базовой форме просто возвращает HTTPRESPOONSORDIRECT
к Success_url
Отказ Как я уже сказал, form_valid
переопределяется Модефланмиксин
, который сначала сохраняет форму, а затем вызывает базовую версию метода.
Давайте переправим процесс до здесь.
- Диспетчер URL запрашивает страницу, содержащую форму с Get.
-
Получить
методProcessFormView
Находит вид класса выбора черезget_form_class.
- Класс формы создается
get_form
со значениями, содержащимися вСамостоятельно. Итак
Словарь - На этом этапе шаблон отображается с контекстом, возвращенным
get_context_data
как обычно. Контекст содержит форму. - Когда использование представляет форму диспетчера URL-адреса запрашивает страницу с сообщением, содержащим данные
-
пост
методProcessFormView
Проверяет форму и действует соответственно, повторяя страницу, если данные недействительны или обрабатывают его и рендурируют шаблон успеха с вновь созданным объектом.
Этот довольно богатый код Tour представил внутренний механизм Createview
Класс, который можно использовать для создания нового объекта в базе данных. UpdateView.
и Deleteview
Классы следуют аналогичному пути, с незначительными изменениями для выполнения различных действий, которые они реализуются.
UpdateView
Хочет показать форму, уже заполненную значениями, поэтому он создает объект перед обработкой запроса ( Код ). Это делает объект доступным в словаре ключевых слов под экземпляр
Ключ ( Код ), который используется модельными формами для инициализации данных ( Код ). Сохранить
метод Базовый газ
достаточно умно, чтобы понять, был ли объект создан или только что изменился ( код Итак, пост
метод UpdateView
работает так же, как один из Createview
Отказ
Deleteview
немного отличается от Createview.
и UpdateView.
. Как Официальная документация Состояния, если они называются с методом получения, он показывает страницу подтверждения, которая сообщает к тому же URL. Итак, как для получения запросов, Deleteview
просто использует Получить
метод, определенный его предком Budlyailview.
( Код ), который делает шаблон, положив объект в контекст. При вызове с запросом на запись, вид использует пост
Метод, определенный Деленмиксин
( Код , который только что звонит Удалить
Метод одного класса ( Код ). Это выполняет удаление в базе данных и перенаправляет к URL успеха.
Как видите, структура за текущей реализацией представлений на основе Django Class достаточно сложна. Это позволяет пользователю добиться сложных поведений, таких как операции CUD, просто определяя пару классов, как я делал в простом примере в начале поста. Однако большую часть времени такое упрощение упрощает программисту для того, чтобы понять, как достичь желаемых изменений в поведении класса. Таким образом, целью этого большого тура, которую я сделал в исходном коде Django, должен был дать представление о том, какие методы вызываются в жизненном цикле вашего HTTP-запроса, чтобы вы могли лучше определить, какие методы вам нужно переопределить.
При выполнении особых действий выпадают за пределы стандартных операций CUD, вы лучше наследуете от FormView
( Код ). Первое, что нужно сделать, это проверить, и как вам нужно настроить Получить
и пост
методы; Помните, что вам либо нужно для реализации полного поведения этих методов или сделать вас изменения и вызоветь родительскую реализацию. Если этого недостаточно для вашего приложения, рассмотрите возможность переопределения одного из более выделенных методов, таких как get_form_kwargs
или form_valid.
.
Читать далее постов, как это на Цифровой кот
Выкапывание видов на основе Django Class (3 части серии)
Оригинал: “https://dev.to/lgiordani/digging-up-django-class-based-views-3-194h”