2012-03-05 89 views
2

我在基礎模板緩存標記:無效特定的緩存

{% cache 100000 categories %} 
    Categories output 
{% endcache %} 

當我通過Django管理增加新的品類,我想否定這一緩存:

class CategoriesAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     super(CategoriesAdmin, self).save_model(request, obj, form, change) 

     cache.delete('categories') 

但緩存保持有效!哪裏不對?

回答

3

這是因爲實際的關鍵是「類別」,而是一個公司的動態可通過Django的使用下面的構造:

args = md5_constructor(u':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on])) 
cache_key = 'template.cache.%s.%s' % (self.fragment_name, args.hexdigest()) 

參見:https://code.djangoproject.com/browser/django/tags/releases/1.3.1/django/templatetags/cache.py

在一般情況下,關鍵是怎麼回事格式爲:template.cache.categories.[hexdigest]。所以棘手的部分是找出十六進制部分。

我發現下面的Django snippet(在評論),它看起來像它應該還是(2009年)工作:

from django.core.cache import cache 
from django.utils.hashcompat import md5_constructor 
from django.utils.http import urlquote 

def invalidate_template_cache(fragment_name, *variables): 
    args = md5_constructor(u':'.join([urlquote(var) for var in variables])) 
    cache_key = 'template.cache.%s.%s' % (fragment_name, args.hexdigest()) 
    cache.delete(cache_key) 

既然你不傳遞任何變量到templatetag不同,你可以可以通過以下方式撥打電話:invalidate_template_cache('categories')。否則,你需要傳遞一個模板標籤變量所有變量的列表作爲第二個參數。

+0

謝謝,這工作正常!爲什麼它仍然不在本地Django函數中! – Deadly 2012-03-05 16:25:22

+2

在Django 1.4.X中,不使用md5_constructor,而必須使用hashlib。 args = hashlib.md5(u':'。join([urlquote(resolve_variable(var,context))for var in self.vary_on])) – margusholland 2013-01-07 07:48:16

0

在Django中1.6+請使用make_template_fragment_key

django.core.cache.utils.make_template_fragment_key(fragment_name, vary_on=None)如果您想獲得用於緩存片段緩存鍵,就可以使用make_template_fragment_key。 fragment_name與緩存模板標籤的第二個參數相同; vary_on是傳遞給標籤的所有附加參數的列表。該功能可以爲無效或覆蓋緩存項,例如有用:

from django.core.cache import cache 
from django.core.cache.utils import make_template_fragment_key 
# cache key for {% cache 500 sidebar username %} 
key = make_template_fragment_key('sidebar', [username]) 
cache.delete(key) # invalidates cached template fragment 

功效神奇:-)