На многих веб-сайтах полезно отслеживать, какие страницы пользователи посещают. Это может помочь в создании персонализированного опыта и улучшении навигации. Одним из способов реализации этой функции является использование куков (cookies). В этом руководстве мы рассмотрим, как использовать куки в Django для хранения информации о недавно посещенных страницах.
Шаг 1: Определение задачи
Наша задача — сохранить в куках информацию о недавно посещенных страницах и показать её пользователям. Мы будем использовать куки для хранения списка слагов (текстовых идентификаторов) страниц, которые пользователь посетил. Этот список будет обновляться каждый раз, когда пользователь посещает новую страницу, и отображаться на самой странице.
Шаг 2: Создание представления (View)
Создадим представление WikiPagesView, которое будет обрабатывать запросы к страницам вики и управлять куками. Для этого нам понадобится следующее:
- Получение данных страницы: Используем Django ORM для получения данных о странице, комментариях и категориях.
- Работа с куками: Читаем и обновляем куки, чтобы отслеживать недавно посещенные страницы.
- Формирование ответа: Рендерим страницу с необходимым контекстом и устанавливаем куки с обновленным списком.
Шаг 3: Код представления
Рассмотрим код нашего представления подробно:
from django.shortcuts import get_object_or_404, redirect, render
from django.views import View
import json
class WikiPagesView(View):
def get(self, request, slug):
# Получаем объект страницы вики по слагу
wiki_page = get_object_or_404(WikiPages, slug=slug)
wiki_pages_categories = WikiPageCategories.objects.all()
wiki_pages_comments = wiki_page.comments.filter(status='published')
wiki_pages_comments_count = wiki_pages_comments.count()
# Определяем текст для количества комментариев
summary = ''
if wiki_pages_comments_count == 0:
summary = 'Оставить комментарий'
elif wiki_pages_comments_count == 1:
summary = 'комментарий'
elif wiki_pages_comments_count // 2 and wiki_pages_comments_count <= 4:
summary = 'комментария'
elif wiki_pages_comments_count > 4:
summary = 'комментариев'
else:
summary = 'комментарий'
# Получаем данные о недавно посещенных страницах из куков
recent_post = request.COOKIES.get('recent_post')
if recent_post:
recent_post = json.loads(recent_post)
else:
recent_post = []
# Добавляем текущую страницу в список недавно посещенных, если её там нет
if wiki_page.slug not in recent_post:
recent_post.append(wiki_page.slug)
if len(recent_post) > 5:
recent_post = recent_post[:5]
response = redirect('wikipages', slug=wiki_page.slug)
response.set_cookie('recent_post', json.dumps(recent_post))
return response
# Формируем контекст для шаблона
categories_with_pages = {}
for category in wiki_pages_categories:
categories_with_pages[category] = WikiPages.objects.filter(category=category)
response = render(request, 'wikipage/wiki_page.html', {
'wiki_page': wiki_page,
'categories_with_pages': categories_with_pages,
'wiki_pages_comments': wiki_pages_comments,
'wiki_pages_comments_count': wiki_pages_comments_count,
'summary': summary,
'recent_post': recent_post,
})
# Устанавливаем куки с данными о недавно посещенных страницах
response.set_cookie('recent_post', json.dumps(recent_post), max_age=60 * 60 * 24 * 7)
return response
Подробное объяснение кода
- Импорт необходимых модулей:get_object_or_404: Функция для получения объекта или возврата ошибки 404, если объект не найден.
redirect: Функция для перенаправления пользователя на другую страницу.
render: Функция для рендеринга шаблона с передачей контекста.
json: Модуль для работы с JSON-данными. - Получение данных страницы:get_object_or_404(WikiPages, slug=slug): Находим объект страницы вики по её слагу. Если страница не найдена, возвращаем ошибку 404.
wiki_pages_categories: Получаем все категории страниц вики.
wiki_pages_comments: Фильтруем комментарии страницы, оставляя только опубликованные.
wiki_pages_comments_count: Получаем количество опубликованных комментариев. - Определение текста для количества комментариев:В зависимости от количества комментариев определяем, какой текст отобразить (например, "комментарий", "комментария", "комментариев").
- Работа с куками:request.COOKIES.get('recent_post'): Получаем данные о недавно посещенных страницах из куков. Если куки отсутствуют, создаем пустой список.
Проверяем, есть ли текущая страница в списке недавно посещенных. Если нет, добавляем её и обрезаем список до пяти элементов.
Обновляем куки с новым списком и перенаправляем пользователя на ту же страницу, чтобы применить изменения. - Формирование ответа:categories_with_pages: Создаем словарь, где ключи — категории, а значения — списки страниц в каждой категории.
render(request, 'wikipage/wiki_page.html', context): Рендерим шаблон страницы вики с переданным контекстом (данные страницы, комментарии, недавно посещенные страницы и т.д.).
Устанавливаем куки с обновленным списком недавно посещенных страниц и сроком действия 7 дней.
Заключение
Использование куков для отслеживания недавно посещенных страниц позволяет создать более персонализированный пользовательский опыт и улучшить навигацию на сайте. В нашем примере мы рассмотрели, как можно реализовать этот функционал в Django, сохраняя данные о посещенных страницах и отображая их пользователям. Этот подход может быть полезен для различных типов веб-приложений, где важно учитывать пользовательскую активность.
Если у вас возникли вопросы или предложения, оставляйте комментарии ниже!