Как реализовать счетчик посещений в универсальном представлении django

Я использую общие представления Django для страницы сведений. Я знаю, что могу использоватьdetailviewдля страницы с подробностями я хочу придерживаться общего представления. Но мое требование - реализовать счетчик посещений Django. Я не знал, как это реализовать. Вот мой модельный пример:

class A(models.Mode):
    title = models.CharField(..)
    ...

Вид здесь:

class PostDetailView(View):
    def get(self, request):
        ...

2 ответа

Вы имеете в виду что-то вроде этого?

class A(models.Mode):
    title = models.CharField(..)
    times_viewed = models.IntegerField(...

class PostDetailView(View):
  def get_object(self):
          obj = super().get_object()
          obj.times_viewed += 1
          obj.save()
          return obj
pip install django-hitcount
    
INSTALLED_APPS = (
    'hitcount',
)

models.py

class Post(models.Model):
    title = models.CharField(max_length=100)
    hit_count_generic = GenericRelation(HitCount, 
                                       object_id_field='object_pk',
                 related_query_name='hit_count_generic_relation')

views.py

#you need to import and use HitCountDetailView instead of just DetailView
from hitcount.views import HitCountDetailView

class PostListView(ListView):
    model = Post
    template_name = 'post_list.html'
    context_object_name = 'post'

class PostDetailView(HitCountDetailView):
    model = Post
    template_name = 'post_detail.html'
    context_object_name = 'post'
    slug_field = 'slug'
    count_hit = True

    def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)
        context.update({
        'popular_posts': Post.objects.order_by('-hit_count_generic__hits')[:3],
        })
        return context

В urls.py вашего основного проекта вам нужно добавить hitcount urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hitcount/', include(('hitcount.urls', 'hitcount'), 
              namespace='hitcount')),
]

post_list.html

{% extends 'base.html' %}
{% load hitcount_tags %}

{% block content %}
  <h2>Posts List</h2>
  <ul>
    {% for post in posts %}
        <p>Views: {% get_hit_count for post %}</p>
    {% endfor %}
  </ul>
{% endblock %}
Другие вопросы по тегам