diff --git a/debug_toolbar/panels/templates/panel.py b/debug_toolbar/panels/templates/panel.py index 8f42be11c..3ae4a6bc9 100644 --- a/debug_toolbar/panels/templates/panel.py +++ b/debug_toolbar/panels/templates/panel.py @@ -141,13 +141,16 @@ def _store_template_info(self, sender, **kwargs): temp_layer[key] = value finally: recording(True) + # Execute pformat first - if for some reason pformat/repr + # causes more templates to be rendered, seen/pformat layers + # will still be consistent + pformatted = pformat(temp_layer) # Refs GitHub issue #910 # If we've not seen the layer before then we will add it # so that if we see it again we can skip formatting it. self.seen_layers.append(key_values) # Note: this *ought* to be len(...) - 1 but let's be safe. index = self.seen_layers.index(key_values) - pformatted = pformat(temp_layer) # Note: this *ought* to be len(...) - 1 but let's be safe. self.pformat_layers.insert(index, pformatted) context_list.append(pformatted) diff --git a/tests/forms.py b/tests/forms.py new file mode 100644 index 000000000..916cb6612 --- /dev/null +++ b/tests/forms.py @@ -0,0 +1,9 @@ +from django import forms +from django.contrib.auth.models import User + + +class TemplateReprForm(forms.Form): + user = forms.ModelChoiceField(queryset=User.objects.all()) + + def __repr__(self): + return str(self) diff --git a/tests/panels/test_template.py b/tests/panels/test_template.py index 8e01c5993..771eea82d 100644 --- a/tests/panels/test_template.py +++ b/tests/panels/test_template.py @@ -3,6 +3,7 @@ from django.test import TestCase, override_settings from ..base import BaseTestCase +from ..forms import TemplateReprForm from ..models import NonAsciiRepr @@ -35,6 +36,18 @@ def test_queryset_hook(self): self.assertIn("<>", ctx) self.assertIn("<>", ctx) + def test_template_repr(self): + # Force widget templates to be included + self.toolbar.config["SKIP_TEMPLATE_PREFIXES"] = () + + User.objects.create(username="admin") + bad_repr = TemplateReprForm() + t = Template("{{ bad_repr }}") + c = Context({"bad_repr": bad_repr}) + html = t.render(c) + self.assertIsNotNone(html) + self.assertValidHTML(html) + def test_object_with_non_ascii_repr_in_context(self): response = self.panel.process_request(self.request) t = Template("{{ object }}")