Django DetailView в Python — примеры отображение объекта
Класс Django DetailView используется для отображения объекта в Python.
- Определение DetailView
- Создайте шаблон task_detail.html
- Определение маршрута
- Изменение шаблона task_list.html
Определение DetailView
Django DetailView позволяет вам определить представление на основе класса, которое отображает детали объекта. Чтобы использовать класс DetailView, вы определяете класс, который наследуется от класса DetailView.
Например, следующее определяет представление на основе класса TaskDetail, которое отображает подробную информацию о задаче приложения Todo:
from django.shortcuts import render from django.views.generic.list import ListView from django.views.generic.detail import DetailView from .models import Task class TaskDetail(DetailView): model = Task context_object_name = 'task' #...
Как это работает.
- Сначала импортируем DetailView из django.views.generic.detail:
from django.views.generic.detail import DetailView
- Во-вторых, определите класс TaskDetail, который наследует класс DetailView. В классе TaskDetail мы определяем следующие атрибуты:
- модель определяет класс объекта, который будет отображаться.
- context_object_name указывает имя объекта в шаблоне. По умолчанию Django использует object в качестве имени объекта в шаблоне. Чтобы сделать это более очевидным, мы используем task в качестве имени объекта.
По умолчанию класс TaskDetail загрузит шаблон с именем task_detail.html из приложения templates/todo.
Если вы хотите использовать другое имя шаблона, вы можете использовать атрибут template_name в классе TaskDetail.
Создайте шаблон task_detail.html
Создайте шаблон task_detail.html в каталоге templates/blog со следующим кодом:
{%extends 'base.html'%} {%block content%} <article class="task"> <header> <h2>{{ task.title }}</h2> <span class="badge {% if task.completed %}badge-completed{% else %}badge-pending{%endif%}"> {% if task.completed %} Completed {%else%} Pending {%endif%} </span> </header> <p>{{task.description}}</p> </article> {%endblock content%}
Шаблон task_detail.html расширяет шаблон base.html.
Шаблон task_detail.html использует задачу в качестве объекта и отображает атрибуты задачи, включая заголовок, статус(выполнено или нет) и описание.
Определение маршрута
Определите маршрут, который сопоставляет URL-адрес, отображающий задачу, с результатом метода as_view() класса TaskDetail:
from django.urls import path from .views import home, TaskList, TaskDetail urlpatterns = [ path('', home, name='home'), path('tasks/', TaskList.as_view(),name='tasks'), path('task/<int:pk>/',TaskDetail.as_view(),name='task'), ]
URL принимает целое число в качестве идентификатора(или первичного ключа, pk) задачи. TaskDetail возьмет этот параметр pk, выберет задачу из базы данных по идентификатору, создаст объект Task и передаст его в шаблон.
Изменение шаблона task_list.html
Измените шаблон task_list.html, включив в него ссылку на каждую задачу в списке задач с помощью тега url:
{%extends 'base.html'%} {%block content%} <div class="center"> <h2>My Todo List</h2> {% if tasks %} <ul class="tasks"> {% for task in tasks %} <li><a href="{% url 'task' task.id %}" class="{% if task.completed%}completed{%endif%}">{{ task.title }}</a> <div class="task-controls"> <a href="#"><i class="bi bi-trash"></i> </a> <a href="#"><i class="bi bi-pencil-square"></i></a> </div> </li> {% endfor %} {% else %} <p>🎉 Yay, you have no pending tasks!</p> {% endif %} </ul> </div> {%endblock content%}
При нажатии на ссылку каждого тега вы будете перенаправлены на страницу с подробностями задачи.
Запустите сервер разработки Django:
python manage.py runserver
и откройте список задач:
http://127.0.0.1:8000/tasks/
вы увидите следующий список задач:
И нажав на задачу, например, «Изучить Python», вы будете перенаправлены на страницу с подробностями задачи: