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')

しかし、キャッシュは有効なままです! なにが問題ですか?

4

2 に答える 2

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]。したがって、トリッキーな部分は、hexdigest 部分を把握することです。

次のDjango スニペット(コメント内) を見つけましたが、これは引き続き機能するようです (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)

テンプレートタグに変更する変数を渡していないので、単に: で呼び出すことができますinvalidate_template_cache('categories')。それ以外の場合は、テンプレート タグが変化するすべての変数のリストを 2 番目の引数として渡す必要があります。

于 2012-03-05T15:40:17.207 に答える