Reputation: 20037
For debugging purposes, I would like to have a variable in all my templates holding the path of the template being rendered. For example, if a view renders templates/account/logout.html I would like {{ template_name }} to contain the string templates/account/logout.html.
I don't want to go and change any views (specially because I'm reusing a lot of apps), so the way to go seems to be a context processor that introspects something. The question is what to introspect.
Or maybe this is built in and I don't know about it?
Upvotes: 9
Views: 6650
Reputation: 969
From Django 1.5 release notes:
New view variable in class-based views context
In all generic class-based views (or any class-based view inheriting from
ContextMixin
), the context dictionary contains aview
variable that points to theView
instance.
Therefore, if you're using class-based views, you can use
{{ view.template_name }}
This works if template_name
is explicitly set as an attribute on the view.
Otherwise, you can use
{{ view.get_template_names }}
to get a list of templates, e.g. ['catalog/book_detail.html']
.
Upvotes: 4
Reputation: 5774
The easy way:
Download and use the django debug toolbar. You'll get an approximation of what you're after and a bunch more.
The less easy way:
Replace Template.render
with django.test.utils.instrumented_test_render
, listen for the django.test.signals.template_rendered
signal, and add the name of the template to the context. Note that TEMPLATE_DEBUG
must be true in your settings file or there will be no origin from which to get the name.
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)
Upvotes: 9
Reputation: 6530
Templates are just strings not file names. Probably your best option is to monkey patch render_to_response
and/or direct_to_template
and copy the filename arg into the context.
Upvotes: 2