この問題は私を午前中ずっと悩ませてきました:
- GETパラメータを受け入れてクエリセット(order_byとpagination)を変更し、キャッシュするビューがいくつかあります。
- これらのビューは非常によく似ており、すべて同じテンプレートを共有しています。
これらのテンプレートは、次のようにページの一部をキャッシュします(GETパラメーターを考慮に入れます)。
{% with order=request.GET.order_by %}{% with page=request.GET.page %}{# I need them to set the cache name #} {% cache 7200 template urlname order page %} .... some part of the page... {% endcache %} {% endwith %}{% endwith %}{# with order and with page #}
クエリセットキャッシュの削除は簡単ですが、テンプレートキャッシュの削除は非常に複雑であることが証明されています。通常、DOCSで説明されているように、cache_keyを生成する必要があります。私の場合の問題は、キーの可能なすべての組み合わせを生成して削除する必要があることです。これは次のように実行しています。
SITE_LIST_OPTIONS = [ ('url', [reverse_lazy('site_list'), reverse_lazy('best_site_list'), reverse_lazy('banned_site_list'), reverse_lazy('toreview_site_list')]), ('order', ['url', 'country', 'upstream_rank']), ('page', range(10))] def delete_cache_keys(keys): '''Deletes all the cache keys on the provided list.''' for e in keys: cache.delete(e) def delete_template_cache(key, filters=None): # first, we need to get all possible filter combination options if filters: options = combine_options(filters) keys = [make_template_fragment_key(key, ops) for ops in options] delete_cache_keys(keys) else: key = make_template_fragment_key(key, filters) cache.delete(key) # context_processor.py (used to generate key in template) def urlname(request): return {'urlname': resolve_urlname(request)}
GETパラメータに基づいてテンプレートをキャッシュしようとしたのは私が初めてではないので、この特定のテンプレートに関連するすべてのキャッシュを削除するための賢明な方法はありますか?
編集:フォーマットが表示されない理由はわかりませんが、http://dpaste.org/XYYo2/に備えてよりクリーンなバージョンがあります