#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 , 20 years ago
comment:2 by , 20 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 , 20 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 , 20 years ago
| milestone: | → Version 1.0 |
|---|
comment:5 by , 20 years ago
| Status: | reopened → new |
|---|
comment:6 by , 20 years ago
| Status: | new → assigned |
|---|
comment:7 by , 20 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?