在django模板中获取模板名称

时间:2009-05-13 17:34:36

标签: python django

出于调试目的,我希望在我的所有模板中都有一个变量,其中包含要呈现的模板的路径。例如,如果视图呈现templates / account / logout.html,我希望{{template_name}}包含字符串templates / account / logout.html。

我不想去改变任何观点(特别是因为我正在重复使用很多应用程序),所以前进的方式似乎是一个内省处理器,可以反省一些内容。问题是要反省什么。

或许这是内置的,我不知道它?

3 个答案:

答案 0 :(得分:9)

简单方法:

下载并使用django debug toolbar。你会得到你所追求的东西和更多东西的近似值。

不太简单的方法:

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)

答案 1 :(得分:2)

模板只是字符串而不是文件名。可能你最好的选择是修补补丁render_to_response和/或direct_to_template并将文件名arg复制到上下文中。

答案 2 :(得分:1)

来自Django 1.5 release notes

  

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

     

在所有通用的基于类的视图(或从ContextMixin继承的任何基于类的视图)中,上下文词典都包含一个指向view实例的View变量。

因此,如果您使用的是基于类的视图,则可以使用

{{ view.template_name }}

如果将template_name明确设置为视图的属性,则此方法有效。

否则,您可以使用

{{ view.get_template_names }}

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