Skip to content

Commit d21a13c

Browse files
authored
Merge pull request #1156 from tomkins/template-cache-indexerror
Fix IndexError: list index out of range
2 parents 90ad2f3 + d31297c commit d21a13c

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

debug_toolbar/panels/templates/panel.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,16 @@ def _store_template_info(self, sender, **kwargs):
141141
temp_layer[key] = value
142142
finally:
143143
recording(True)
144+
# Execute pformat first - if for some reason pformat/repr
145+
# causes more templates to be rendered, seen/pformat layers
146+
# will still be consistent
147+
pformatted = pformat(temp_layer)
144148
# Refs GitHub issue #910
145149
# If we've not seen the layer before then we will add it
146150
# so that if we see it again we can skip formatting it.
147151
self.seen_layers.append(key_values)
148152
# Note: this *ought* to be len(...) - 1 but let's be safe.
149153
index = self.seen_layers.index(key_values)
150-
pformatted = pformat(temp_layer)
151154
# Note: this *ought* to be len(...) - 1 but let's be safe.
152155
self.pformat_layers.insert(index, pformatted)
153156
context_list.append(pformatted)

tests/forms.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from django import forms
2+
from django.contrib.auth.models import User
3+
4+
5+
class TemplateReprForm(forms.Form):
6+
user = forms.ModelChoiceField(queryset=User.objects.all())
7+
8+
def __repr__(self):
9+
return str(self)

tests/panels/test_template.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django.test import TestCase, override_settings
44

55
from ..base import BaseTestCase
6+
from ..forms import TemplateReprForm
67
from ..models import NonAsciiRepr
78

89

@@ -35,6 +36,18 @@ def test_queryset_hook(self):
3536
self.assertIn("<<queryset of auth.User>>", ctx)
3637
self.assertIn("<<triggers database query>>", ctx)
3738

39+
def test_template_repr(self):
40+
# Force widget templates to be included
41+
self.toolbar.config["SKIP_TEMPLATE_PREFIXES"] = ()
42+
43+
User.objects.create(username="admin")
44+
bad_repr = TemplateReprForm()
45+
t = Template("{{ bad_repr }}")
46+
c = Context({"bad_repr": bad_repr})
47+
html = t.render(c)
48+
self.assertIsNotNone(html)
49+
self.assertValidHTML(html)
50+
3851
def test_object_with_non_ascii_repr_in_context(self):
3952
response = self.panel.process_request(self.request)
4053
t = Template("{{ object }}")

0 commit comments

Comments
 (0)