如果你只是發送一個鏈接到已經被回答的地方,我不會被冒犯。我還沒有找到答案。被緩存的Django自定義模板標籤
我正在啓用cached template loader的網站上工作。他們有一個自定義模板標籤,他們在多個頁面上調用,並且傳遞給該標籤的值之一是調用它的頁面的唯一文章ID。問題是緩存的模板加載器似乎也緩存了值,因此即使每個頁面都將其文章ID傳遞給標記,標記也會使用緩存的文章ID。
有沒有辦法禁用單個模板標籤的緩存模板加載器?
下面是一些代碼,如果它是有幫助的:
這是緩存的模板加載器設置:
TEMPLATE_LOADERS = (
('django.template.loaders.cached.Loader', (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)),
)
當我註釋掉此設置並重新啓動服務器,問題消失了,所以我知道它與緩存有關。
上面鏈接的doc也談到確保模板標籤是thread-safe。這是因爲模板如何存儲在緩存中?我從這個關於線程安全的筆記中得出的結論是,傳遞給模板標籤的值不應該分配給節點本身,而應該分配給render_context。我在正確的軌道上嗎?
這裏是一個樣本什麼我的代碼是這樣做的:
調用第1頁上的標籤:
{% my_tag article_id="{{object.article_id}}" %}
調用2頁上的標記:
{% my_tag article_id="{{object.article_id}}" %}
在這兩種上述情況下,object.article_id是一個模板變量,其中包含調用模板標籤的頁面的文章ID。
下面是模板標籤代碼(簡體)。
@register.tag(name="my_tag")
def do_my_tag(parser, token):
article_id = None
values = token.split_contents()
kwargs = get_kwargs(values[1:])
if "article_id" in kwargs:
article_id = kwargs["id"]
return DoMyTagNode(article_id)
class DoMyTagNode(template.Node):
def __init__(self, article_id):
self.article_id = article_id
self.template = get_template('path/to/template.html')
def render(self, context):
article_id = Template(self.article_id).render(context)
context.update({ 'article_id': article_id })
return render_to_string(self.template, context)
任何幫助將不勝感激!