2013-01-08 42 views
3

如果你只是發送一個鏈接到已經被回答的地方,我不會被冒犯。我還沒有找到答案。被緩存的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) 

任何幫助將不勝感激!

回答

0

你不應該在開發中使用django.template.loaders.cached.Loader,因爲它意味着你的html文件沒有被更改,需要你重新啓動服務器。這很可能是你的問題,因爲你沒有真正提供更多。

緩存的加載器沒有緩存模板的輸出,而是緩存文件系統中的模板。他們仍然會像沒有裝載機一樣正常工作,所以這不是你的問題。加載器不會緩存自定義標記的輸出。

相關問題