Projects can have very complicated logic in their templates. Subtle bugs while creating a template can lead to hard-to-find bugs. We need to set TEMPLATE_DEBUG
to True
(in addition to DEBUG
) in settings.py
so that Django shows a better error page when there is an error in your templates.
There are several crude ways to debug templates, such as inserting the variable of interest, such as {{ variable }}
, or if you want to dump all the variables, use the built-in debug
tag like this (inside a conveniently clickable text area):
<textarea onclick="this.focus();this.select()" style="width: 100%;">
{% filter force_escape %}
{% debug %}
{% endfilter %}
</textarea>
A better option is use the Django Debug Toolbar mentioned earlier. It not only tells you the values of the context variables but also shows the inheritance tree of your templates.
However, you might want to pause in the middle of a template to inspect the state (say, inside a loop). A debugger would be perfect for such cases. In fact, it is possible to use any one of the aforementioned Python debuggers for your templates using custom template tags.
Here is a simple implementation of such a template tag. Create the following file inside a templatetag
package directory:
# templatetags/debug.py import pudb as dbg # Change to any *db from django.template import Library, Node register = Library() class PdbNode(Node): def render(self, context): dbg.set_trace() # Debugger will stop here return '' @register.tag def pdb(parser, token): return PdbNode()
In your template, load the template tag library, insert the pdb
tag wherever you need the execution to pause, and enter the debugger:
{% load debug %} {% for item in items %} {# Some place you want to break #} {% pdb %} {% endfor %}
Within the debugger, you can examine anything, including the context variables using the context
dictionary:
>>> print(context["item"]) Item0
If you need more such template tags for debugging and introspection, then I would recommend that you check out the django-template-debug
package.