Как создать приложение CRUD с представлениями на основе классов Django

8
и технологии 2.webp.webp

Содержание

Последнее обновление 19.07.2023 — Василий Иванов

Одной из ключевых особенностей Django является встроенная поддержка создания проектов поверх операций CRUD (создание, чтение, обновление, удаление). Хотя представления Django на основе классов обеспечивают быстрый, простой и гибкий способ создания веб-приложений, многие разработчики по-прежнему используют представления на основе функций.

По теме:  4 причины перейти на Pixel Watch 2 (и 3 причины подождать)

Представления на основе классов предлагают несколько преимуществ по сравнению с представлениями на основе функций, включая наследование, структурирование кода, возможность повторного использования кода и многое другое. Хотя реализация представлений на основе классов может показаться несколько сложной, это руководство поможет вам понять концепцию, создав приложение диспетчера задач и предоставив пошаговые инструкции.

Что такое представления на основе классов в Django?

В Django представления — это функции Python, которые принимают веб-запрос и возвращают веб-ответ. Представления на основе классов (CBV) — это альтернативный способ определения представлений в Django с использованием классов Python вместо функций.

CBV имеют несколько преимуществ, таких как лучшая организация кода, более простое повторное использование кода и возможность использовать наследование для создания вариантов существующих представлений. CBV также предоставляют встроенные методы, такие как методы get() и post(), которые вы можете перезаписать для пользовательских поведений.

Код, используемый в этой статье, доступен в этом репозитории GitHub.

Представления на основе классов доступны в Django

Django предоставляет несколько встроенных CBV для популярных случаев использования, таких как отображение списков объектов или создание новых. Некоторые из этих встроенных CBV:

  1. ListView: это представление отображает список объектов, извлеченных из модели. Например, на странице со списком всех сообщений, доступных в блоге, будет использоваться ListView.
  2. DetailView: это представление отображает подробный вид одного объекта, извлеченного из модели. Вы можете использовать DetailView для отображения сведений о конкретных сообщениях в приложении блога.
  3. CreateView: это представление отображает форму для создания нового объекта и обрабатывает отправку формы. Например, в приложении диспетчера задач вы будете использовать это представление для создания новых задач.
  4. DeleteView: это представление отображает страницу подтверждения для удаления объекта и обрабатывает удаление страницы.
  5. UpdateView: это представление отображает форму для обновления существующего объекта и обрабатывает отправку формы.
По теме:  4 способа уменьшить расход заряда батареи Google Chrome на Android

Django также предоставляет другие представления, включая TemplateView, RedirectView и FormView. Вы можете обратиться к документации Django для получения подробной информации о представлениях на основе классов.

Создайте приложение диспетчера задач с представлениями на основе классов Django

Создание приложения, такого как приложение диспетчера задач, позволит вам понять, как реализовать операции CRUD с CBV. Диспетчер задач имеет функции, которые позволяют пользователям создавать, обновлять, удалять и читать задачи. Эти функции соответствуют операциям CRUD. Следующие шаги помогут вам создать приложение диспетчера задач с Django CBV.

Настроить проект Django

Чтобы создать приложение диспетчера задач с помощью Django, вы должны начать со следующих шагов:

  1. Установите Django в виртуальную среду Python с помощью этой команды:
     pip install django 
  2. Создайте проект Джанго. Следующая команда создаст проект с именем project_core.
     django-admin startproject project_core . 
  3. Создайте приложение с именем task_manager.
     python manage.py startapp task_manager 
  4. В файле settings.py добавьте имя вашего приложения в список INSTALLED_APPS.
     INSTALLED_APPS = [
        'task_manager',
    ]
  5. Откройте файл urls.py в каталоге вашего проекта и настройте URL-адреса для вашего приложения task_manager:
     from django.urls import path, include

    urlpatterns = [
        path('', include('task_manager.urls')),
    ]

Создайте модель для своего приложения диспетчера задач

В каталоге вашего приложения (или в папке task_manager) откройте файл models.py и создайте модель для своего приложения диспетчера задач. Вот пример модели, которую вы можете использовать:

 from django.db import models

class Task(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    completed = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

Перенесите свою модель с помощью этой команды:

 python manage.py makemigrations && python manage.py migrate

Создайте форму Django для своего приложения

У вас должна быть форма для обработки операций создания и обновления. В каталоге вашего приложения создайте файл с именем forms.py. Вот пример:

 from django import forms
from .models import Task

class TaskForm(forms.ModelForm):
    class Meta:
        model = Task
        fields = ['title', 'description', 'completed']

        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control',}),
            'description': forms.Textarea(attrs={'class': 'form-control',}),
            'completed': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        }

В приведенном выше коде есть класс TaskForm, который определяет поля и виджеты формы. Он также указывает используемую модель.

Создание представлений Django для каждой операции CRUD

Базовому приложению CRUD с CBV требуется как минимум четыре представления для эффективной обработки всех операций. Следующие несколько шагов покажут вам, как их создавать.

Импортируйте необходимые модули и пакеты

Откройте файл views.py и выполните следующие операции импорта:

 from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Task
from .forms import TaskForm

Приведенный выше код импортирует пять CBV. Он также импортирует reverse_lazy для перенаправления пользователя на указанный URL-адрес после отправки формы. Наконец, он импортирует модель Task и созданную ранее форму TaskForm.

Создайте представление для списка объектов модели

Приложение диспетчера задач должно иметь страницу со списком всех задач, созданных пользователем. Чтобы создать представление для этого, вы должны использовать ListView. Вот пример:

 class TaskListView(ListView):
    model = Task
    template_name = 'task_manager/task_list.html'
    context_object_name = 'tasks'

Представление выше определяет три атрибута:

  1. модель: этот атрибут определяет, какую модель использовать для этого конкретного представления.
  2. template_name: этот атрибут сообщает Django, какой шаблон отображать в браузере.
  3. context_object_name: этот атрибут определяет имя, которое позволяет шаблону получить доступ к списку объектов в модели.

Большинство CBV будут содержать эти три атрибута.

Создайте представление для обработки сведений о задаче

Каждая задача, которую создает пользователь, должна иметь страницу с подробной информацией. Идеальным CBV для решения этой проблемы является DetailVew. Вот простой пример:

 class TaskDetailView(DetailView):
    model = Task
    template_name = 'task_manager/task_detail.html'

Создайте представление для создания задачи

Создайте представление для управления созданием или добавлением новых задач. Это часть Create операций CRUD, и правильным представлением для этого является CreateView. Вот как это использовать:

 class TaskCreateView(CreateView):
    model = Task
    form_class = TaskForm
    template_name = 'task_manager/task_form.html'
    success_url = reverse_lazy('task_list')

В приведенном выше коде представлены два новых атрибута: form_class и success_url.

Атрибут form_class сообщает представлению, какой класс формы отображать и использовать для своих операций.

Success_url указывает, как перенаправить пользователя после отправки формы. Он использует функцию reverse_lazy, которая принимает имя URL-пути.

Создание представления для редактирования задач

Чтобы ваши пользователи могли редактировать или обновлять свои задачи, вы должны создать представление, которое выглядит следующим образом:

 class TaskUpdateView(UpdateView):
    model = Task
    form_class = TaskForm
    template_name = 'task_manager/task_form.html'
    success_url = reverse_lazy('task_list')

Приведенное выше представление похоже на TaskCreateView, созданное ранее. Единственная разница заключается в использовании UpdateView.

Создайте представление для обработки операций удаления

Чтобы ваши пользователи могли удалять задачи в любое время, вы должны использовать CBV DeleteView. Вот пример:

 class TaskDeleteView(DeleteView):
    model = Task
    template_name = 'task_manager/task_confirm_delete.html'
    success_url = reverse_lazy('task_list')

Настройте URL-адреса вашего приложения

В каталоге вашего приложения создайте файл urls.py и настройте шаблоны URL следующим образом:

 from django.urls import path
from .views import TaskListView, TaskDetailView, TaskCreateView, TaskUpdateView, TaskDeleteView

urlpatterns =
    path('', TaskListView.as_view(), name='task_list'),
    path('create/', TaskCreateView.as_view(), name='task_create'),
    path('tasks/<int:pk>/', TaskDetailView.as_view(), name='task_detail'),
    path('tasks/<int:pk>/update/', TaskUpdateView.as_view(), name='task_update'),
    path('tasks/<int:pk>/delete/', TaskDeleteView.as_view(), name='task_delete'),
]

Приведенные выше шаблоны URL-адресов аналогичны URL-адресам, созданным с помощью представлений на основе функций. Отличие заключается в том, что в конец каждого имени представления добавляется функция as_view().

Вы можете использовать слаги Django для создания URL-адресов вместо первичного ключа, использованного выше.

Создавайте шаблоны для ваших представлений

Разрешение вашим пользователям выполнять действия, определенные в приведенных выше представлениях, предполагает, что вы предоставляете им интерфейс для взаимодействия. Из представлений, созданных ранее, приложение диспетчера задач должно иметь четыре пользовательских интерфейса.

В каталоге вашего приложения создайте четыре HTML-шаблона. Вы также должны создать файл base.html. Вы можете стилизовать свои шаблоны Django с помощью Bootstrap, чтобы сэкономить время.

Шаблон списка задач

Этот шаблон должен включать код, в котором перечислены все задачи в модели. Скелетный пример кода таков:

 {% extends 'base.html' %}

{% block content %}
<center>
    <h1>Your Tasks</h1>
    <a href="{% url 'task_create' %}">Add Task</a>
      {% for task in tasks %}
      <div>
        <div>
          <h5>{{ task.title }}</h5>
          <p>{{ task.description|truncatechars:50 }}</p>
          <p>
            <strong>Completed:</strong>
            {% if task.completed %}Yes{% else %}No{% endif %}
          </p>
          <a href="{% url 'task_detail' task.pk %}">
            Read more
          </a>
          <a href="{% url 'task_delete' task.pk %}">
            Delete task
          </a>
        </div>
      </div>
        {% empty %}
          <h3>No tasks yet.</h3>
          <a href="{% url 'task_create' %}">Add Task</a>
      {% endfor %}
</center>
{% endblock %}

С помощью некоторых классов Bootstrap вы можете сделать свою страницу такой:

Шаблон сведений о задаче

На этой странице должна отображаться полная информация о каждой созданной задаче. Вот пример шаблона, который вы можете использовать:

 {% extends 'base.html' %}

{% block content %}
<h1>{{ task.title }}</h1>
<p>{{ task.description }}</p>
<p>Completed: {% if task.completed %}Yes{% else %}No{% endif %}</p>
<a href="{% url 'task_update' task.pk %}">Edit task</a>
<a href="{% url 'task_delete' task.pk %}">Delete task</a>
{% endblock %}

В зависимости от вашего подхода к стилю ваша страница должна выглядеть так:

Шаблон формы задачи

Этот шаблон должен содержать форму, позволяющую пользователю создать или обновить задачу.

 {% extends 'base.html' %}

{% block content %}
  <h1>Create Task</h1>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
  </form>
{% endblock %}

Шаблон будет выглядеть так:

Удалить шаблон задачи

Этот шаблон должен быть страницей подтверждения для предотвращения случайного удаления задач.

 {% extends 'base.html' %}

{% block content %}
  <h1>Confirm Delete</h1>
  <p>Are you sure you want to delete "{{ object.title }}"?</p>
  <form method="post">
    {% csrf_token %}
    <button type="submit">Delete</button>
    <a href="{% url 'task_list' %}">Cancel</a>
  </form>
{% endblock %}

С некоторым Bootstrap ваша страница должна выглядеть так:

Используйте представления на основе классов для повышения производительности

Представления на основе классов — отличный способ написать чистый, организованный код за короткое время, тем самым повысив производительность. Вы должны использовать их в своих проектах как можно больше. Кроме того, вы можете дополнительно интегрировать такие функции, как функция поиска, уведомления и т. д., чтобы сделать ваше приложение диспетчера задач полноценным функциональным приложением.