Django 查看计数器

Posted

技术标签:

【中文标题】Django 查看计数器【英文标题】:Django View Counter 【发布时间】:2015-03-03 13:13:35 【问题描述】:

在我的 views.py 中创建视图计数器功能的最佳方法是什么?

我确实在 Django 文档中找到了 F() 表达式,但是如何使它工作或有更好的主意?

提前谢谢你

def watch_video(request, slug):

    video = get_object_or_404(Video, slug=slug)

    template = "single_video.html" 

    #if this function will run , + 1 in Video.views ?


    return render(request,template,"video":video)

我的模特:

class Video(models.Model):

    video_id = models.CharField(max_length=150)
    title = models.CharField(max_length=150)
    slug = AutoSlugField(populate_from="title")
    description = models.TextField(blank=True)
    views = models.PositiveIntegerField(default=0)
    likes = models.PositiveIntegerField(default=0)
    category = models.ForeignKey("VideoCategory")
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    tags = models.ManyToManyField("Tag")


    def __str__(self):

        return self.title

    def get_absolute_url(self):

        return reverse("watch", kwargs="slug" : self.slug)

【问题讨论】:

您不只是想在每次来自同一 IP 的访问时增加计数器。您需要跟踪 IP,以便如果用户一次又一次地从同一个 IP 访问,计数器不应增加。那里有一些包,例如django-hitcount 和django-visits Track the number of "page views" or "hits" of an object?的可能重复 【参考方案1】:

在过滤单个视频的查询集上调用update()

from django.db.models import F

Video.objects.filter(pk=video.pk).update(views=F('views') + 1)
video.views += 1 # to show valid counter in the template

【讨论】:

这通常是正确的方法。我唯一要改变的是你添加到你当前拥有的对象的方式。最好从数据库中重新加载视频(或仅在更新后加载)。对于第一个选项,您应该使用 video.refresh_from_db(fields=['views']) - 这是因为此字段可能会在运行时被其他查看者更新【参考方案2】:

在模型中添加一个增加视图的函数非常简单

然后在views.py中调用增加函数,每次用户访问该模型的页面并保存它!

【讨论】:

您能否提供一些代码来澄清您的意思。干杯

以上是关于Django 查看计数器的主要内容,如果未能解决你的问题,请参考以下文章

将喜欢和页面访问计数添加到 Django 项目

Django页面命中计数器并发

在数据库中递增 IntegerField 计数器

Django模板中的条件计数器循环

循环中的 Django 计数器以索引列表

Django - 一个计数器模板标签,即使使用嵌套的 for 标签也能很好地工作