【问题标题】:How to add a page view count for django detail view?如何为 django 详细视图添加页面查看次数?
【发布时间】:2019-02-24 19:12:14
【问题描述】:

我正在使用 django 执行博客应用程序..

我想在用户看到特定博客时跟踪页面查看计数,无论是注册用户还是非注册用户...

并且还想根据浏览次数显示浏览次数最多的博客..

谁能帮帮我..

谢谢

【问题讨论】:

  • 对于非注册用户 - 只需利用 Google Analytics。我想对于登录的用户,您可以使用漏斗,并通过分析来解决所有这些问题。这无助于根据观看次数进行显示,但您没有给我们任何代码。
  • 你可以使用中间件...但是我没有你的代码和你的项目层次结构

标签: django django-models django-templates django-views


【解决方案1】:

models.py

class Blog(models.Model):
    #fields you need
    blog_views=models.IntegerField(default=0)

views.py

def blog_post(request,post_id):
    #your code
    blog_object=Blog.objects.get(id=post_id)
    blog_object.blog_views=blog_object.blog_views+1
    blog_object.save()
    #your code

这将只计算每次博客访问。这也将计算单个用户的多次查看。

【讨论】:

  • blog_views = blog_views + 1 引入了竞争条件。考虑服务器并行处理多个请求并且在get()save() 之间发生更新的情况。更好的方法使用F() 表达式,请参阅this answer
【解决方案2】:
  1. 将 IntegerField 添加到您的模型中以存储视图计数。
  2. 更改您的视图,当视图收到请求时,它将通过在先前的计数上加一来增加计数。

models.py:

blog_view = models.IntegerField(default=0)

views.py:

class BlogView(DetailView):
    model = Blog
    def get_object(self):
        obj = super().get_object()
        obj.blog_view += 1
        obj.save()
        return obj

【讨论】:

  • 虽然此代码可能提供问题的解决方案,但强烈建议您提供有关此代码为何和/或如何回答问题的附加上下文。从长远来看,只有代码的答案通常会变得毫无用处,因为未来遇到类似问题的观众无法理解解决方案背后的原因。
  • 每次遇到请求时使用这个视图增加2
【解决方案3】:

我们可以通过在数据库中为帖子视图创建一个表来使用 IPAdress 来计算视图。

在models.py中

from django.contrib.auth.models import User
class PostViews(models.Model):
    IPAddres= models.GenericIPAddressField(default="45.243.82.169")
    post = models.ForeignKey('Post', on_delete=models.CASCADE)

    def __str__(self):
        return '{0} in {1} post'.format(self.IPAddres,self.post.title)

然后,像这样将它设为 Post 类的属性。

models.py 例如:

class Post(models.Model):
    title = models.CharField(max_length=100, unique= True)
    slug= models.SlugField(blank=True, null=True, unique=True)
    @property
    def views_count(self):
        return PostViews.objects.filter(post=self).count()

你可以阅读关于属性here然后

在views.py中

from .models import PostViews

def PostsDetailsView(request,slug):
    post_details=Post.objects.get(slug=slug)
    def get_client_ip(request):
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip

    PostViews.objects.get_or_create(user=request.user, post=post_details)

所以这个函数确保如果这个IPAdress 已经看到这个帖子,如果他第一次看到这个帖子,它不会做任何事情,它会在数据库中创建一个对象并将其计为一个视图。 您可以阅读有关 IPAdress here 的更多信息。 不要忘记在 admin.py 中进行迁移、迁移和注册 PostViews 类

【讨论】:

  • 如何在模板中访问这个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2021-07-04
  • 2020-10-30
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多