#27584 closed Bug (fixed)
Template error raised in a parent template shows incorrect source location on debug page
| Reported by: | Bob | Owned by: | nobody | 
|---|---|---|---|
| Component: | Template system | Version: | 1.10 | 
| Severity: | Normal | Keywords: | |
| Cc: | Preston Timmons | Triage Stage: | Accepted | 
| Has patch: | yes | Needs documentation: | no | 
| Needs tests: | no | Patch needs improvement: | no | 
| Easy pickings: | no | UI/UX: | no | 
Description
When an error is raised from a template the django debug page attempts to show the location in the template where the error occurred.  When this error occurs in a tag located on a parent template the debug page incorrectly shows the source from the child template instead of the parent.
Using a simple instance of template inheritance:
base.html
{% load app_tags %}
<!DOCTYPE HTML>
<html>
<head>
    <title>basic</title>
	{% magic %}
		<div>banana</div>
	{% endmagic %}
</head>
<body>
    {% block fill %}
    {% endblock %}
</body>
</html>
specific.html
{% extends "base.html" %}
{% block fill %}
<div>
    something specific
</div>
{% endblock fill %}
And define magic tag to just error
from django import template register = template.Library() @register.tag(name="magic") def do_magic(parser, token): nodelist = parser.parse(('endmagic',)) parser.delete_first_token() return MagicNode() class MagicNode(template.Node): def render(self, context): raise template.TemplateSyntaxError('oh dear')
With debug enabled loading a view that renders the specific.html template generates the debug page which displays
Error during template rendering In template /home/bob/code/test-template-tag/testtemplatetag/basic/templates/specific.html, error at line 7 oh dear
And an excerpt from the specific.html template with line seven highlighted (the text "something specific").  Instead of the correct line from base.html.
I took a look through the history of the code generating the debug information, I believe it is this change https://github.com/django/django/commit/55f12f8709f0604df7e1817a4c114ead1fb9a311 that has changed the behaviour.  Looking at the tags this was included in 1.9, so I checked out 1.8 and it correctly displays the base.html source code and identifies the magic tag as the line triggering the error.
Change History (6)
comment:1 by , 9 years ago
| Triage Stage: | Unreviewed → Accepted | 
|---|
comment:2 by , 9 years ago
| Cc: | added | 
|---|
comment:3 by , 9 years ago
I see the problem.
The debug information is populated correctly if the error happens during compilation time (when Template.compile_nodelist is called), but not at render time (when Node.render_annotated is called). This is due to this line:
https://github.com/django/django/blob/master/django/template/base.py#L963
The wrong source is used since context.template is always the parent template.
It needs some clean up, but here's an approach to fix the problem:
comment:4 by , 9 years ago
| Has patch: | set | 
|---|
comment:6 by , 9 years ago
This ticket fixed {% include %} -- see #27956 for a similar issue with {% extends %}.
I confirmed that 55f12f8709f0604df7e1817a4c114ead1fb9a311 is where the behavior changed. Preston, do you have any advise or pointers? #27593 may be related or a duplicate.