JavaRush /Курсы /Модуль 3: Django /Работа с ListView и DetailView

Работа с ListView и DetailView

Модуль 3: Django
4 уровень , 4 лекция
Открыта

Продолжаем наше путешествие по миру Django CBV! Сегодня в программе — ListView и DetailView, два класса, без которых сложно представить современное Django-приложение. ListView поможет красиво вывести список всех ваших товаров/статей/котиков, а DetailView покажет подробности о каждом из них. И хотя на первый взгляд они кажутся простыми, под капотом скрывается море полезных фишек, которые мы сейчас и раскроем.

1. Введение в ListView и DetailView

ListView — это класс-представление, которое используется для отображения списков объектов. Например, если вы хотите показать список блогов или продуктов,ListView — отличный выбор для этого. Этот CBV автоматически готовит данные в виде списка и передает их в шаблон.

DetailView — это класс-представление, предназначенный для показа деталей одного конкретного объекта. Например, если пользователь кликает на пост в блоге, чтобы увидеть полный текст, это задача для DetailView. Он берет объект по указанному идентификатору (обычно pk или id) и передает его в шаблон.

2. Настройка ListView

Что ж, давайте немного попрограммируем! Мы будем использовать наше приложение "Blog", которое мы начали разрабатывать ранее.

Шаг 1. Определяем модель (если до этого ещё не сделали):

Вот модель Post, она предоставляет наши блоговые посты:

# models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)  # Заголовок поста
    content = models.TextField()  # Текст поста
    pub_date = models.DateTimeField(auto_now_add=True)  # Дата публикации

    def __str__(self):
        return self.title

Шаг 2. Создаем представление:

Теперь давайте создадим ListView, который покажет список всех постов.

# views.py
from django.views.generic import ListView
from .models import Post

class PostListView(ListView):
    model = Post  # Указываем модель
    template_name = 'post_list.html'  # Ваш шаблон для отображения
    context_object_name = 'posts'  # Имя переменной контекста для списка объектов

Ключевые параметры:

  • model — это модель, с которой работает представление.
  • template_name — путь к вашему HTML-шаблону.
  • context_object_name — имя переменной, под которой ваши данные будут переданы в шаблон.

Шаг 3. Настраиваем маршруты:

Теперь нужно подключить наше представление к URL.

# urls.py
from django.urls import path
from .views import PostListView

urlpatterns = [
    path('', PostListView.as_view(), name='post-list'),
]

Шаг 4. Создаем шаблон:

И, наконец, создаем файл post_list.html.

<!-- templates/post_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Список постов</title>
</head>
<body>
    <h1>Список постов</h1>
    <ul>
        {% for post in posts %}
            <li>{{ post.title }} (Опубликован: {{ post.pub_date }})</li>
        {% endfor %}
    </ul>

{% if is_paginated %}
    <div>
        Страницы:
        {% for page_num in paginator.page_range %}
            {% if page_num == page_obj.number %}
                <strong>{{ page_num }}</strong>
            {% else %}
                <a href="?page={{ page_num }}">{{ page_num }}</a>
            {% endif %}
        {% endfor %}
    </div>
{% endif %}
</body>
</html>

Теперь, если вы запустите сервер и откроете главную страницу (http://127.0.0.1:8000/), то увидите список всех опубликованных постов.

Полезные параметры ListView

  • paginate_by — позволяет настроить пагинацию. Например, paginate_by = 5 покажет по 5 объектов на странице.
  • ordering — задает порядок сортировки объектов. Например, ordering = ['-pub_date'] выведет записи в обратном порядке публикации.

3. Настройка DetailView

Теперь займемся DetailView. Это представление подхватывает отдельный объект из базы данных и передает его в шаблон.

Шаг 1. Создаем представление:

Добавим класс PostDetailView для отображения деталей поста.

# views.py
from django.views.generic import DetailView

class PostDetailView(DetailView):
    model = Post  # Модель, с которой работает представление
    template_name = 'post_detail.html'  # Шаблон для отображения деталей
    context_object_name = 'post'  # Имя переменной контекста

Шаг 2. Настраиваем маршруты:

Добавим маршрут для отображения детальной информации о посте. Обратите внимание на <int:pk>, который будет использоваться для передачи ID-поста в представление.

# urls.py
from .views import PostDetailView

urlpatterns = [
    path('<int:pk>/', PostDetailView.as_view(), name='post-detail'),
]

Шаг 3. Создаем шаблон:

Теперь добавим файл post_detail.html.

<!-- templates/post_detail.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ post.title }}</title>
</head>
<body>
    <h1>{{ post.title }}</h1>
    <p>Опубликован: {{ post.pub_date }}</p>
    <p>{{ post.content }}</p>
    <a href="/">Назад к списку</a>
</body>
</html>

Теперь, когда вы откроете страницу, например, http://127.0.0.1:8000/1/, вы увидите детали поста с ID 1.

4. Комбинирование ListView и DetailView

Чтобы пользователь мог переходить от списка постов к их деталям, изменим шаблон post_list.html.

<!-- templates/post_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Список постов</title>
</head>
<body>
    <h1>Список постов</h1>
    <ul>
        {% for post in posts %}
            <li>
                <a href="{{ post.id }}/">{{ post.title }}</a>
                (Опубликован: {{ post.pub_date }})
            </li>
        {% endfor %}
    </ul>
</body>
</html>

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

5. Полезные свойства и методы

ListView: get_queryset()

Метод get_queryset() позволяет настроить выборку объектов, которые будут отображаться в представлении.

class PostListView(ListView):
    model = Post

    def get_queryset(self):
        return Post.objects.filter(pub_date__year=2023)  # Показываем только посты 2023 года

DetailView: get_context_data()

Метод get_context_data() позволяет добавить дополнительные данные в контекст шаблона.

class PostDetailView(DetailView):
    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['extra_data'] = 'Это дополнительная информация'
        return context

В шаблоне можно использовать {{ extra_data }}.

6. Возможные ошибки и их решение

Иногда вы можете столкнуться с ошибкой DoesNotExist, если объект, соответствующий указанному ID, не найден в базе данных. Чтобы обработать такие случаи, используйте метод get_object(). Туда можно добавить кастомную логику.

from django.http import Http404

class PostDetailView(DetailView):
    model = Post

    def get_object(self, queryset=None):
        obj = super().get_object(queryset)
        if not obj:
            raise Http404("Пост не найден")
        return obj

Теперь ваш проект стал намного функциональнее! С ListView вы можете легко отображать списки данных, а с DetailView — показывать подробности конкретного объекта. Эти инструменты помогут вам быстро разрабатывать приложения и сосредотачиваться на бизнес-логике, а не на бесконечном написании однотипного кода.

1
Задача
Модуль 3: Django, 4 уровень, 4 лекция
Недоступна
Создание простого ListView
Создание простого ListView
1
Задача
Модуль 3: Django, 4 уровень, 4 лекция
Недоступна
Создание DetailView для отображения деталей продукта
Создание DetailView для отображения деталей продукта
3
Опрос
Class-Based Views (CBV), 4 уровень, 4 лекция
Недоступен
Class-Based Views (CBV)
Class-Based Views (CBV)
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ