【问题标题】:Django View CounterDjango 查看计数器
【发布时间】: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})

【问题讨论】:

标签: python django counter


【解决方案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中调用增加函数,每次用户访问该模型的页面并保存它!

【讨论】:

  • 您能否提供一些代码来澄清您的意思。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多