From 769e90548f8e61873d1eed439c5b8d8fb973a3fe Mon Sep 17 00:00:00 2001 From: Alex Tomkins Date: Tue, 23 Apr 2019 14:12:24 +0100 Subject: [PATCH 1/2] Add test to show repr template rendering --- tests/forms.py | 9 +++++++++ tests/panels/test_template.py | 13 +++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 tests/forms.py 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 }}") From d31297c1fc71f4e816061eab5f21c3d059cc8a3f Mon Sep 17 00:00:00 2001 From: Alex Tomkins Date: Tue, 23 Apr 2019 15:19:27 +0100 Subject: [PATCH 2/2] Run pformat before adding to seen_layers Fixes problems where repr may render more templates --- debug_toolbar/panels/templates/panel.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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)