Как подсчитать просмотры блога в django

Я пытаюсь подсчитать и показать все просмотры в каждом блоге в моем проекте django. Какой лучший способ сделать это? (простите за ошибки?

)

Вот подход, который вы можете использовать, предполагая, что вы хотите обновлять счетчик просмотров сообщения каждый раз, когда это сообщение было просмотрено зрителем.

Вы можете добавить integer field на Post model. Это поле в посте может быть обновлено, когда этот пост был просмотрен.

Вы также можете добавить method на Post model, который будет специально обновлять счетчик просмотров всякий раз, когда его вызывают, что может позволить обновлять счетчик просмотров постов из самого шаблона hmtl (не рекомендуется), а также в views (будь то cbv или fbv).

Внутри файла models.py:

class Post(models.Model):
     ...
     views = models.IntegerField(default=0) # Upon creation the views will be 0
     ...

    # You can have
    def get_absolute_url(self):
         return reverse('post-details', kwargs={"id": self.id})

    # An alternative to use to update the view count 
    def update_views(self, *args, **kwargs):
         self.views = self.views + 1
         super(Post, self).save(*args, **kwargs)

Внутри app urls.py файла:

from app.views import PostDetailsView, post_details

urlpatterns = [
    ...
    # Using either of the following
    path('post-details/<int:id>/', PostDetailsView.as_view(), name='post-details'), # class-based view
    path('post-details/<int:id>/', post_details, name='post-details'), # function-based view 
    ...
]

Внутри файла views.py:

# Class based view
class PostDetailView(DetailView):
     context_object_name = 'post'
     template_name = 'post-details.html'

     # Overriding the class get_object method
     def get_object(self):
          post_id = self.kwargs.get('id')
          post = get_object_or_404(Post, id=post_id)

          # Update the view count on each visit to this post.
          if post:
               post.views = post.views + 1
               post.save()
   
               # Or
               post.update_views()

          return post

    # You might have other methods in here if necessary
    ...

# Function based view
def post_detail(request, id):
     post = get_object_or_404(Post, id=id)

     # Update the view count on each visit to this post.
      if post:
           post.views = post.views + 1
           post.save()

           # Or
           post.update_views()

     ...

     context = {
          'post': post,
           ...
     }

     return render(request, "post-details.html", context)
Вернуться на верх