2015-03-03 85 views
0

在我的views.py中設置查看計數器功能的最佳方法是什麼?Django查看計數器

我在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}) 
+0

您不僅僅希望在來自同一IP的每次訪問時增加計數器。您需要跟蹤IP,以便如果用戶一次又一次從相同的IP訪問計數器,則不應遞增。這裏有一些軟件包,比如[django-hitcount](https://github.com/thornomad/django-hitcount/)和[django-visits](https://bitbucket.org/jespino/django-visits) – 2015-03-03 13:35:02

回答

5

呼籲查詢集的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 
+0

完美的作品,謝謝! – John 2015-03-03 13:31:41

+0

這通常是正確的做法。我只會改變你添加到你當前擁有的對象的方式。最好從數據庫重新加載視頻(或僅在更新後加載)。對於第一個選項,您應該使用video.refresh_from_db(fields = ['views']) - 這是因爲該字段可能會在其他查看器更新時運行 – 2017-01-26 18:13:32

0

這是非常簡單的化妝增長在增加視圖的模型中起作用1

然後在views.py調用中,每當用戶訪問該模型的頁面並保存時,就會增加功能!

+0

您能否提供一些代碼來澄清您的意思。乾杯 – 2016-08-08 17:40:54