DetailView — CBV для отображения одного объекта по его pk или slug.
Базовый пример
from django.views.generic import DetailView
from .models import Task
class TaskDetailView(DetailView):
model = Task
template_name = 'tasks/task_detail.html'
context_object_name = 'task'
URL
path('tasks/<int:pk>/', views.TaskDetailView.as_view(), name='task-detail'),
# или по slug:
path('tasks/<slug:slug>/', views.TaskDetailView.as_view(), name='task-detail'),
Шаблон
<h1>{{ task.title }}</h1>
<p>Статус: {{ task.get_status_display }}</p>
<p>Владелец: {{ task.owner.username }}</p>
<p>Создана: {{ task.created_at|date:"d.m.Y" }}</p>
<a href="{% url 'task-edit' task.pk %}">Редактировать</a>
<a href="{% url 'task-delete' task.pk %}">Удалить</a>
Дополнительный контекст
class TaskDetailView(DetailView):
model = Task
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['related_tasks'] = Task.objects.filter(
project=self.object.project
).exclude(pk=self.object.pk)[:5]
return context
Проверка прав доступа
from django.contrib.auth.mixins import LoginRequiredMixin
class TaskDetailView(LoginRequiredMixin, DetailView):
model = Task
def get_queryset(self):
return Task.objects.filter(owner=self.request.user)
Slug вместо pk
class TaskDetailView(DetailView):
model = Task
slug_field = 'slug' # поле в модели
slug_url_kwarg = 'slug' # параметр в URL
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!