Index: views/debug.py
===================================================================
--- views/debug.py (revision 7520)
+++ views/debug.py (working copy)
@@ -474,7 +474,7 @@
{% for var in frame.vars|dictsort:"0" %}
{{ var.0|escape }} |
- {{ var.1|pprint|escape }} |
+ {{ var.1|safe_pprint|escape }} |
{% endfor %}
Index: template/defaultfilters.py
===================================================================
--- template/defaultfilters.py (revision 7520)
+++ template/defaultfilters.py (working copy)
@@ -793,6 +793,24 @@
return u"Error in formatting: %s" % force_unicode(e, errors="replace")
pprint.is_safe = True
+from pprint import PrettyPrinter
+class SafePrettyPrinter(PrettyPrinter):
+ '''A PrettyPrinter that will never evaluate an unevaluated QuerySet.'''
+ def format(self, object, *a, **kw):
+ from django.db.models.query import QuerySet
+ if isinstance(object, QuerySet):
+ object = object.query.as_sql()
+ return PrettyPrinter.format(self, object, *a, **kw)
+
+def safe_pprint(value):
+ """A wrapper around pprint that ensures that QuerySets don't get evaluated.
+ If the QuerySet results have already been used, they will be cached and the
+ result will be identical to normal pprint. However, if the QuerySet has not
+ been used, this filter will return the SQL that the QuerySet would execute."""
+ pp = SafePrettyPrinter()
+ return pp.pformat(value)
+
+
# Syntax: register.filter(name of filter, callback)
register.filter(add)
register.filter(addslashes)
@@ -831,6 +849,7 @@
register.filter(random)
register.filter(rjust)
register.filter(safe)
+register.filter(safe_pprint)
register.filter('slice', slice_)
register.filter(slugify)
register.filter(stringformat)