Django DetailView в Python — примеры отображение объекта

Класс Django DetailView используется для отображения объекта в Python.

Содержание

Определение 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 мы определяем следующие атрибуты:
  1. модель определяет класс объекта, который будет отображаться.
  2. 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», вы будете перенаправлены на страницу с подробностями задачи:

Перенаправление на страницу подробностей задачи

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *