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 查看计数器的主要内容,如果未能解决你的问题,请参考以下文章