2010-06-21 95 views
1

段從this question我在哪裏放置這個計數器增量代碼?

from django.db.models import F 
... 
MyModel.objects.filter(id=...).update(hit_count=F(hit_count)+1) 

有人建議把中間件採取和我讀了一下關於middleware但將不勝感激,如果有人能指出,他們將在這種情況下做什麼。以我的Bug模型爲例,它有一個獨特的slug字段和pk。

這裏是我的模型:

class Bug(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(unique=True) 
    excerpt = models.TextField() 
    excerpt_markdown = models.TextField(editable=False, blank=True) 
    summary = models.TextField() 
    summary_markdown = models.TextField(editable=False, blank=True) 
    #workaround = models.TextField() 
    #workaround_markdown = models.TextField(editable=False, blank=True) 
    date_added = models.DateTimeField() 
    poster = models.ForeignKey(User) 
    tags_string = TagField() 

    class Meta: 
    ordering = ['name'] 

    def __unicode__(self): 
    return self.name 

    def get_absolute_url(self): 
    return '/bugs/%s/' % self.slug 

    def save(self, force_insert=False, force_update=False): 
    self.summary_markdown = markdown( self.summary ) 
    self.excerpt_markdown = markdown (self.excerpt) 
    #self.workaround_markdown = markdown( self.workaround) 
    super(Bug, self).save(force_insert, force_update) 

鏈接通過/bugs/(slug)觀看。我還沒有添加新列,但我想這只是hit_counter = models.IntegerField()

回答

3

意見您有三個選項:

  1. 將代碼放置在中間件中,以便它通過RequestContext在您的模板中可用。

  2. 將代碼放置在裝飾器中(本質上只是一個包裝另一個函數的Python函數,並添加了一些功能),以便您可以決定要將「計數」代碼應用於何處。

  3. 放置在一個自定義模板標籤中的代碼,將每一個與標籤模板渲染的時候增加計數器。

選項三(模板標籤)是最複雜的,但最適合實際用途,因爲它可以呈現計數器並將其增加到一段代碼中。選項1(中間件)是最簡單的,但也是最不靈活/可重複使用的等等。

中間件和模板標籤在Django的文檔中都有很好的記錄。通過它們,你會得到更多的工作,而不是在SO上拿到代碼片段。

裝飾是因爲V2.4 Python中的一個基本組成部分,是值得學習的,而不是解決方案,我會選擇這裏。他們是一個強大的工具,Google搜索(甚至搜索SO)會爲您提供大量信息。

+0

由於模板已被緩存,選項三並不適合此目的。 的代碼應該住在BugManager類,但被擺放在你的視圖或只是在視圖的開始裝飾大概叫。 – rewritten 2011-03-20 14:11:33

0

我更喜歡把它裝飾內裝潢所有訪問該模型

+0

我不完全相信你說當你提到裝飾什麼 - 你可以提供一個例子嗎? – 2010-06-21 07:14:44

1

可能值得指出的是,如果每次用戶查看模型時都保存模型,這將導致大多數緩存沒有意義,因爲模型比任何緩存都更新鮮。

如果這對您很重要,您可能需要考慮一種保留緩存的方法 - 例如,在每個視圖上更新單獨的Hits模型,然後在緩存友好的時間間隔內將這些匹配計數摺疊回主模型。