如何在 Django 模板标签中设置全局可访问的上下文变量?

How to set globally-accessible context variables in django template tags?

有一个模板标签,其中 returns 是列表中的一个随机元素。我还需要保存列表中的所有元素以及在上下文中选择的元素,然后在 django-debug-toolbar 面板中描述该信息。

from django import template
import random

register = template.Library()

@register.simple_tag(takes_context=True, name='pickrandomelementtag')
def pickrandomelementtag(context, list_of_random_elements):
    context.dicts[0]["key18"] = "value19"
    return random.choice(list_of_random_elements)

所以我用给定的行测试设置变量功能:

context.dicts[0]["key18"] = "value19" 

我可以在模板中访问 {{key18}},但我的目标是设置此变量以便稍后(全局?)从 django-debug-toolbar 面板访问它。这就是我被困的地方。

这是我的 django-debug-toolbar panels.py 文件:

from debug_toolbar.panels import Panel
from django.template.loader import render_to_string
from django.utils.translation import ugettext_lazy as _
from django.template.response import SimpleTemplateResponse



class RandomPanel(Panel):
    name = "RandomPanel;"
    has_content = True
    template = 'panels/randompanel.html'

    def title(self):
        return _('Random Panel')

    def generate_stats(self, request, response):
        print('that is where I need to access key18')
        self.record_stats(
            {
                "request": request
            }
        )

如何在 RandomPanel class 对象的 generate_stats 方法中访问上下文变量 key18?或者 context 是在模板标签中设置自定义变量的错误位置,您会建议其他方法吗?非常感谢!

您实际上可以将信息存储在请求本身中。假设 context_processordjango.template.context_processors.request(在默认设置中)

@register.simple_tag(takes_context=True, name='pickrandomelementtag')
def pickrandomelementtag(context, list_of_random_elements):
    context['request'].META['MY_INFO'] = "value19"
    return random.choice(list_of_random_elements)

然后您在 Panel 中有 request 对象,您可以在其中使用此信息。