WeekArchiveView
Класс WeekArchiveView наследуется от базового представления
Django и предназначен для создания страниц архива записей,
сгруппированных по неделям. Он автоматически извлекает из URL
параметры года и недели, формирует выборку объектов за
указанную неделю и передает их в шаблон. Для работы
представления необходимо указать модель и поле даты,
по которому будет выполняться фильтрация.
Синтаксис
from django.views.generic.dates import WeekArchiveView
class MyWeekArchiveView(WeekArchiveView):
model = MyModel
date_field = "created_at"
Параметры
Класс WeekArchiveView принимает следующие основные параметры:
-
model- модель, объекты которой будут отображаться -
date_field- поле модели с типомDateTimeFieldилиDateField, по которому выполняется группировка -
template_name- имя шаблона для отображения архива -
context_object_name- имя переменной контекста для списка объектов -
allow_empty- разрешает или запрещает отображение страницы при отсутствии объектов
Пример . Использование
Давайте создадим представление для отображения статей, опубликованных за определенную неделю:
from django.views.generic.dates import WeekArchiveView
from myapp.models import Article
class ArticleWeekArchiveView(WeekArchiveView):
model = Article
date_field = "published_at"
template_name = "article_week_archive.html"
context_object_name = "articles"
allow_empty = True
Настройка URL
Для работы представления необходимо настроить маршрут
в файле urls.py с указанием параметров года и недели:
from django.urls import path
from myapp.views import ArticleWeekArchiveView
urlpatterns = [
path(
"archive/<int:year>/week/<int:week>/",
ArticleWeekArchiveView.as_view(),
name="article_week_archive"
),
]
После настройки маршрута представление будет доступно по URL-адресу, содержащему год и номер недели.
Пример . Шаблон
В шаблоне доступны переменные контекста для отображения списка объектов и информации о неделе:
<h1>Статьи за неделю {{ week|date:"W" }}, {{ week|date:"Y" }}</h1>
<ul>
{% for article in articles %}
<li>{{ article.title }} ({{ article.published_at|date:"d.m.Y" }})</li>
{% empty %}
<li>Нет статей за эту неделю</li>
{% endfor %}
</ul>
Дополнительная настройка
Вы можете переопределить метод get_queryset для
кастомизации выборки объектов:
from django.views.generic.dates import WeekArchiveView
from myapp.models import Article
class ArticleWeekArchiveView(WeekArchiveView):
model = Article
date_field = "published_at"
context_object_name = "articles"
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(status="published")
Обработка ошибок
Если объекты за указанную неделю не найдены, представление
по умолчанию выбрасывает ошибку Http404. Чтобы избежать
этого, установите параметр allow_empty в значение True:
from django.views.generic.dates import WeekArchiveView
from myapp.models import Article
class ArticleWeekArchiveView(WeekArchiveView):
model = Article
date_field = "published_at"
allow_empty = True
context_object_name = "articles"
Смотрите также
-
класс
YearArchiveView,
который отображает архив объектов за год -
класс
MonthArchiveView,
который отображает архив объектов за месяц -
класс
DayArchiveView,
который отображает архив объектов за день -
класс
TodayArchiveView,
который отображает архив объектов за текущий день