如何为 django 详细信息视图添加页面查看计数?

Nil*_*Kar 5 django django-templates django-models django-views

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

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

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

谁能帮我解决这个..

谢谢

Abh*_*h K 11

模型.py

class Blog(models.Model):
    #fields you need
    blog_views=models.IntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)

视图.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
Run Code Online (Sandbox Code Playgroud)

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

  • `blog_views = blog_views + 1` 引入了竞争条件。考虑服务器并行处理多个请求并且更新发生在“get()”和“save()”之间的情况。更好的方法使用“F()”表达式,请参阅[此答案](/sf/ask/111925271/) (3认同)

小智 6

我们可以通过为数据库中的帖子视图创建一个表来使用 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)
Run Code Online (Sandbox Code Playgroud)

然后,让它成为 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()
Run Code Online (Sandbox Code Playgroud)

你可以阅读有关财产在这里

在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)
Run Code Online (Sandbox Code Playgroud)

所以这个函数保证如果这个IPAdress看过这个帖子,他第一次看到这个帖子就什么都不做,它会在数据库中创建一个对象,并把它算作一个视图。您可以在此处阅读有关 IPAdress 的更多信息。不要忘记在 admin.py 中进行迁移、迁移和注册 PostViews 类