2015-03-03 3 views
0

Каков наилучший способ сделать функцию счетчика на моих view.py?Django View Counter

Я нашел выражения F() в документации Django, но как заставить его работать или лучше понимать?

Спасибо заранее

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-посещения] (https://bitbucket.org/jespino/django-visits) –

ответ

5

Вызовите update() на QuerySet, который фильтрует одно видео:

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

+0

Это, как правило, правильный способ сделать это. единственное, что я бы изменил, - это то, как вы добавляете к объекту, который у вас есть. лучше перезагрузить видео из базы данных (или загрузить его только после обновления). для первого варианта вы должны использовать video.refresh_from_db (поля = ['views']) - это потому, что это поле может быть обновлено другими зрителями, пока оно работает –

0

Это очень просто сделать увеличение функция в модели, которая увеличивает видимость на 1

Затем в view.py вызывается увеличение функции каждый раз, когда пользователь посещает страницу этой модели и сохраняет ее!

+0

Не могли бы вы предоставить некоторый код, чтобы прояснить, что вы имеете в виду. ура –