2009-05-26 7 views
1

Die Seite nutzt 2 Objekte - Artikel und Blogs. Jedes Mal, wenn ein Artikel oder ein Blog angezeigt wird, sollte ein entsprechender Zähler um eins erhöht werden.Django Contenttypen und Dekorateur

Die Idee ist eine "Top-Ten" -Anwendung, die die "Popularität" der Artikel und Einträge misst.

Da ich mehr als ein Objekt verwende, möchte ich, dass das Tracker-Modell einen genericForeignKey für die zugehörigen Objekte verwendet.

#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 

Ich möchte einen Decorator schreiben, der eine Ansichtsfunktion umschließt, aber es ist möglicherweise nicht notwendig.

Dank

Antwort

2

Wenn ich verstehe, dass Sie sich wünschen Sie jede Instanziierung jedes Objekt zu zählen. Ich würde es tun, indem Sie eine post_initsignal verwenden - wenn es Ihnen nichts ausmacht, dass es kein Dekorateur ist.

Hier ist ein Code, schrieb ich - post_save statt post_init mit:

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

so ein post_init Signal gesendet wird, wenn der db mit einer Abfrage für ein Objekt getroffen wird? Und indem wir auf das Signal mit einem Zähler hören und darauf reagieren, können wir zählen, wie oft eine bestimmte "Instanz" in einer Ansicht instanziiert wurde. Genial! –

+0

Dies ist nicht die Lösung, aber nahe: post_init Signale werden jedes Mal gesendet, wenn eine Instanziierung auch im Admin passiert; Ich muss nur die Benutzeransichten verfolgen. Ich werde versuchen, ein benutzerdefiniertes Signal zu setzen. –

+0

Sie könnten die Objekte in Ihrer Ansicht * als * markieren, die von der Ansicht durch Affepatching berührt werden, wie obj.touched = True. in einem Signal würde man nachsehen (und sollte es wieder löschen) – vikingosegundo