在Django模板中获取模板名称
为了调试,我想在所有模板中有一个变量,保存正在渲染的模板的路径。比如,如果一个视图渲染了templates/account/logout.html,我希望{{ template_name }}能包含字符串templates/account/logout.html。
我不想去修改任何视图(特别是因为我在重复使用很多应用),所以看起来可以通过一个上下文处理器来实现这个功能,具体来说就是要查看一些东西。问题是要查看什么。
或者,也许这个功能是内置的,我还不知道?
3 个回答
模板其实就是一些字符串,而不是文件名。你可以考虑修改一下 render_to_response
和/或 direct_to_template
这两个函数,把文件名的参数复制到上下文中去。
来自 Django 1.5 的发布说明:
类视图上下文中的新视图变量
在所有通用的类视图(或者任何继承自
ContextMixin
的类视图)中,上下文字典里有一个view
变量,它指向当前的View
实例。
所以,如果你在使用类视图,你可以这样做:
{{ view.template_name }}
这在 template_name
被明确设置为视图的一个属性时有效。
否则,你可以使用:
{{ view.get_template_names }}
来获取模板列表,比如 ['catalog/book_detail.html']
。
简单的方法:
下载并使用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)