2009-05-26 2 views
1

Сайт использует 2 объекта - статьи и блоги. Каждый раз, когда просматривается статья или блог, связанный счетчик должен увеличиваться на единицу.Django Contenttypes and decorator

Идея состоит в том, чтобы иметь приложение «первой десятки», которое измеряет «популярность» статей и записей.

Поскольку я использую более одного объекта, я бы хотел, чтобы модель Tracker использовала genericForeignKey для связанных объектов.

#models.py 
class Tracker(models.Model): 
    count = models.PositiveIntegerField(default=1) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 
    def hit(self): 
     self.count += 1 

Я хотел бы написать декоратор, который обертывает функцию просмотра, но это может быть необязательно.

Благодаря

ответ

2

Если я правильно Вас понял вы хотите считать каждый экземпляр каждого объекта. Я бы сделал это, используя post_initsignal - если вы не возражаете, что это не декоратор.

Вот код, я написал - используя post_save вместо post_init:

def thumb_init(sender, **kwargs): 
    kwargs['instance'].process() 
    kwargs['instance'].make_thumbnail() 

post_init.connect(thumb_init, sender=Thumbnail) 
post_init.connect(thumb_init, sender=<otherModel here>) 
+0

так post_init посылается сигнал всякий раз, когда дб ударил с запросом для объекта? И, слушая и реагируя на сигнал с помощью счетчика, мы можем подсчитать, сколько раз конкретный экземпляр был создан в представлении. Потрясающие! –

+0

Это не решение, но закрыть: сообщения post_init отправляются каждый раз, когда экземпляр происходит в администраторе; Мне нужно отслеживать только пользовательские представления. Я попробую сделать собственный сигнал. –

+0

, на ваш взгляд, вы могли бы * пометить * объекты, которые были затронуты видом через обезьяньи патчи, такие как obj.touched = True. в сигнале u будет проверять его (и должен удалить его снова) – vikingosegundo