3

これがすでに回答されている場所へのリンクを送信するだけで気分を害することはありません. 私はこれに対する答えを見つけていません。

キャッシュされたテンプレート ローダーが有効になっているサイトで作業しています。多くのページで呼び出すカスタム テンプレート タグがあり、このタグに渡される値の 1 つは、それを呼び出したページの一意の記事 ID です。問題は、キャッシュされたテンプレート ローダーも値をキャッシュしているように見えるため、各ページがその記事 ID をタグに渡しているにもかかわらず、タグはキャッシュされた記事 ID を使用していることです。

単一のテンプレート タグに対してキャッシュされたテンプレート ローダーを無効にする方法はありますか?

役立つ場合は、次のコードを示します。

これは、キャッシュされたテンプレート ローダーの設定です。

TEMPLATE_LOADERS = (
    ('django.template.loaders.cached.Loader', (
        'django.template.loaders.filesystem.Loader',
        'django.template.loaders.app_directories.Loader',
    )),
)

この設定をコメントアウトしてサーバーを再起動すると、問題が解決するので、キャッシュに「何か」関係があることがわかります。

上記のリンク先のドキュメントでは、テンプレート タグがスレッド セーフであることを確認することについても説明しています。これは、テンプレートがキャッシュに保存される方法によるものですか? スレッド セーフに関するメモから私が理解できることは、テンプレート タグに渡される値は、ノード自体ではなく、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)

どんな助けでも大歓迎です!

4

1 に答える 1