在Django模板中获取模板名称

9
为了调试目的,我想在所有模板中都有一个变量来保存正在渲染的模板路径。例如,如果视图呈现 templates/account/logout.html 模板,则希望 {{ template_name }} 包含字符串 templates/account/logout.html。
我不想去更改任何视图(特别是因为我正在重用很多应用程序),所以看起来最好的方法是编写一个上下文处理器来内省一些东西。问题是要内省什么。
或者这已经内置了,只是我不知道?
3个回答

9

简单的方法:

下载并使用Django调试工具栏,您将获得所需的近似值以及更多其他选项。

较为复杂的方法:

django.test.utils.instrumented_test_render替换Template.render,监听django.test.signals.template_rendered信号,并将模板名称添加到上下文中。请注意,在您的设置文件中必须设置TEMPLATE_DEBUG为true,否则将无法获取名称来源。

if settings.DEBUG and settings.TEMPLATE_DEBUG

    from django.test.utils import instrumented_test_render
    from django.test.signals import template_rendered


    def add_template_name_to_context(self, sender, **kwargs)
        template = kwargs['template']
        if template.origin and template.origin.name
            kwargs['context']['template_name'] = template.origin.name

    Template.render = instrumented_test_render

    template_rendered.connect(add_template_name_to_context)

4

来自Django 1.5发行说明

类视图上下文中的新视图变量

在所有通用类视图(或任何继承自ContextMixin的类视图)中,上下文字典包含指向View实例的view变量。

因此,如果您正在使用类视图,可以使用

{{ view.template_name }}

如果在视图中将template_name显式设置为属性,则此方法可行。

否则,你可以使用

{{ view.get_template_names }}

要获取模板列表,例如['catalog/book_detail.html']


2

模板只是字符串而非文件名。也许你最好的选择是猴子补丁render_to_response和/或direct_to_template,并将文件名参数复制到上下文中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接