Как добавить счетчик уникальных просмотров на сайт без завязки на авторизацию. Т.е. без необходимости регистрироваться на сайте. Ответ — сессии. Она начинается с момента вашего захода на сайт и хранит в себе ваши запросы (действия) на этом сайте. Лайки, просмотры, товары в корзине и прочее. Сессия в django по умолчанию живет две недели, но мы сделаем два месяца.
Делается это в файле C:\Users\<Ваш пользователь>\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\django\conf\global_settings.py.
# Age of cookie, in seconds (default: 2 weeks). SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 10
Т.е. секунды * минуты * часы * дни * недели.
Уровень данной статьи предполагает, что вы уже можете самостоятельно создать проект django, настроить url, создавать простые модели, делать миграции, создавать шаблоны. Если нет — то посмотрите эту статью.
Счетчик просмотров я буду делать для статей блога. И так мы имеем блог со списком статей, которые описаны моделью Post файл models.py в django приложении.
from django.db import models from ckeditor_uploader.fields import RichTextUploadingField class Post(models.Model): # название публикации title = models.CharField(max_length=150, db_index=True) # уникальный идентификатор slug = models.SlugField(max_length=150, unique=True) # счетчик просмотров count_views = models.IntegerField(default=0) # текст статьи body = RichTextUploadingField(blank=True) # дата публикации date_pub = models.DateField(auto_now_add=True) # изображение img = models.ImageField(upload_to='images/', blank=True) class Meta: ordering = ['date_pub'] def __str__(self): return '{}'.format(self.title) def get_absolute_url(self): return reverse('post_detail_url', kwargs={'slug': self.slug})
Как видно модель Post обладает вполне обычным набором свойств. Выделить тут можно только поле body
body = RichTextUploadingField(blank=True)
Такой тип поля необходим потому что для создания статей я применяю редактор CKEditor. Если у вас его нет, то замените этот тип поля на CharField или TextField.
Теперь создадим модель которая будет содержать в себе информацию о пользователе (сессию) и идентификатор поста, который он просмотрел. Во все тот же models.py добавим:
class PostCountViews(models.Model): # привязка к пользователю (сессии пользователя) sesId = models.CharField(max_length=150, db_index=True) # привязка к посту postId = models.ForeignKey(Post, blank=True, null=True, default=None, on_delete=models.CASCADE) def __str__(self): return '{}'.format(self.sesId)
Модели созданы, не забываем сделать миграции и зарегистрировать модели в admin.py
admin.site.register(Post) admin.site.register(PostCountViews)
Теперь переходим к функциям отображения наших постов views.py
def post_detail(request, slug): # Проверяем есть ли пост с запрашиваемым слагом post = get_object_or_404(Post, slug__iexact=slug) if not request.session.session_key: request.session.save() # получаем сессию session_key = request.session.session_key is_views = PostCountViews.objects.filter(postId=post.id, sesId=session_key) # если нет информации о просмотрах создаем ее if is_views.count() == 0 and str(session_key) != 'None': views = PostCountViews() views.sesId = session_key views.postId = post views.save() post.count_views += 1 post.save() return render(request, 'post_detail.html', context={'post': post})
Что значит этот код. При открытии статьи мы получаем сессию пользователя, потом проверяем есть ли у нас уже просмотры этой статьи (post.id) с этим пользователем (session_key). Если нет создаем и добавляем счетчик в статье. После чего сохраняем модели.
Все, осталось отобразить это в шаблоне post_detail.html
{% block content %} {% for post in posts %} ..... <div>{{ post.date_pub }}</div> <div>{{ post.count_views }}</div> ..... {% endfor %} {% endblock %}
Как менялся логотип Apple на протяжении многих лет. Логотип Apple — это не просто символ,…
Security Boot Fail при загрузке Acer — решение проблемы При загрузке ноутбука Acer с флешки,…
Ноутбук не включается — варианты решения Если при попытке включить ноутбук вы обнаруживаете, что он…
The AC power adapter wattage and type cannot be determined — причины и решение При…
Свистит или звенит блок питания компьютера — причины и решения Некоторые владельцы ПК могут обратить…
Мигает Caps Lock на ноутбуке HP — почему и что делать? При включении ноутбука HP…