Рубрики
Без рубрики

Выкапывание видов на основе Django Class – 3

Этот пост был первоначально опубликован на цифровой коте В первых двух вопросах этой короткой серии … Теги с Джанго, Ооп, Питон.

Выкапывание видов на основе 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 – это просто полезный способ отправить почтовые запросы, но не единственный.

Почему виды формы отличаются от стандартных просмотров? Ответ можно найти, глядя на поток типичных данных представления данных на веб-сайте:

  1. Пользователь просматривает веб-страницу (Get)
  2. Сервер отвечает на запрос GET со страницей, содержащей форму
  3. Пользователь заполняет форму и представляет его (пост)
  4. Сервер получает и обрабатывает данные

Как вы можете видеть, что процедура включает в себя двойное взаимодействие с сервером: первый запрос получает страницу, второй посты данных. Таким образом, вам нужно построить представление, которое отвечает на запрос 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 переопределяется Модефланмиксин , который сначала сохраняет форму, а затем вызывает базовую версию метода.

Давайте переправим процесс до здесь.

  1. Диспетчер URL запрашивает страницу, содержащую форму с Get.
  2. Получить метод ProcessFormView Находит вид класса выбора через get_form_class.
  3. Класс формы создается get_form со значениями, содержащимися в Самостоятельно. Итак Словарь
  4. На этом этапе шаблон отображается с контекстом, возвращенным get_context_data как обычно. Контекст содержит форму.
  5. Когда использование представляет форму диспетчера URL-адреса запрашивает страницу с сообщением, содержащим данные
  6. пост метод 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”