Как подсчитать просмотры блога в 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)