在Django模板中获取模板名称

9 投票
3 回答
6191 浏览
提问于 2025-04-15 11:34

为了调试,我想在所有模板中有一个变量,保存正在渲染的模板的路径。比如,如果一个视图渲染了templates/account/logout.html,我希望{{ template_name }}能包含字符串templates/account/logout.html。

我不想去修改任何视图(特别是因为我在重复使用很多应用),所以看起来可以通过一个上下文处理器来实现这个功能,具体来说就是要查看一些东西。问题是要查看什么。

或者,也许这个功能是内置的,我还不知道?

3 个回答

2

模板其实就是一些字符串,而不是文件名。你可以考虑修改一下 render_to_response 和/或 direct_to_template 这两个函数,把文件名的参数复制到上下文中去。

4

来自 Django 1.5 的发布说明

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

在所有通用的类视图(或者任何继承自 ContextMixin 的类视图)中,上下文字典里有一个 view 变量,它指向当前的 View 实例。

所以,如果你在使用类视图,你可以这样做:

{{ view.template_name }}

这在 template_name 被明确设置为视图的一个属性时有效。

否则,你可以使用:

{{ view.get_template_names }}

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

9

简单的方法:

下载并使用django调试工具栏。这样你就能大致得到你想要的东西,还能获得更多其他功能。

稍微复杂的方法:

Template.render替换成django.test.utils.instrumented_test_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)

撰写回答