#128 closed defect (worksforme)
IndexError when using invalid {% extends %} in template should be replaced with better error message.
Reported by: | Owned by: | Adrian Holovaty | |
---|---|---|---|
Component: | Template system | Version: | |
Severity: | normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
First of all the error
There's been an error: Traceback (most recent call last): File "/usr/lib/python2.4/site-packages/django/core/handlers/wsgi.py", line 190, in get_response return callback(request, **param_dict) File "/home/espen/django/blog/apps/blog/views/blog.py", line 20, in details return HttpResponse(t.render(c)) File "/usr/lib/python2.4/site-packages/django/core/template.py", line 116, in render return self.nodelist.render(context) File "/usr/lib/python2.4/site-packages/django/core/template.py", line 437, in render bits.append(node.render(context)) File "/usr/lib/python2.4/site-packages/django/core/template_loader.py", line 80, in render parent_is_child = isinstance(compiled_parent.nodelist[0], ExtendsNode) IndexError: list index out of range
The template file that trys to extend base.html:
{% extends "base" %} {% block title %} Espen Grindhaug - Blog - {{ obj.headline }} {% endblock %} {% block content %} <h1>{{ obj.headline }}</h1> <p class="summary">{{ obj.summary }}</p> <p class="body">{{ obj.body }}</p> <p class="by">By {{ obj.author }} ({{ obj.pub_date }})</p> {% endblock %}
The weird thing here is that I get exactly the same error with completly different child template.
base.html (the same as in URL):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}Espen Grindhaug{% endblock %}</title> </head> <body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div> </body>
The details function in blog.py that loads the template:
def details(request, slug): try: obj = entries.get_object(slug__exact=slug) except entries.EntryDoesNotExist: raise Http404 t = template_loader.get_template('blog/details') c = Context(request, { 'obj':obj,}) return HttpResponse(t.render(c))
Change History (9)
comment:1 by , 19 years ago
comment:2 by , 19 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
The simple solution was to change {% extends "base" %} to {% extends "blog/base" %}
*a little bit ashamed* :/
comment:3 by , 19 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
Summary: | IndexError when using {% extends "base" %} in template. → IndexError when using invalid {% extends %} in template should be replaced with better error message. |
That error message is extremely unhelpful; I'm reopening this ticket and changing the title to indicate that we should fix the error message.
comment:4 by , 19 years ago
milestone: | → Version 1.0 |
---|
comment:5 by , 19 years ago
Status: | reopened → new |
---|
comment:6 by , 19 years ago
Status: | new → assigned |
---|
comment:7 by , 19 years ago
Resolution: | → worksforme |
---|---|
Status: | assigned → closed |
I set about fixing this error message, but I can't reproduce it. I get a "Template 'base' cannot be extended, because it doesn't exist" message, which is expected behavior. Please reopen if you can reproduce the strange IndexError
.
Very strange. Is your base template called "base.html", and is it within your template root, rather than being in the "blogs" subdirectory of the template root?