#16335: Document why you cannot iterate defaultdict in templates
-------------------------------------+-------------------------------------
Reporter: jacob.ninja.dev@… | Owner:
Type: Bug | bluejeansummer
Component: Documentation | Status: closed
Severity: Normal | Version: 1.3
Keywords: | Resolution: fixed
Has patch: 1 | Triage Stage: Ready for
Needs tests: 0 | checkin
Easy pickings: 1 | Needs documentation: 0
| Patch needs improvement: 1
| UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by diego.gaustein@…):
I am actually getting a MemoryError (which sometimes end in segfault) when
trying to iterate the values in a defaultdict
In views.py:
{{{
totals = defaultdict(Decimal)
add_stuff_to_it(totals)
}}}
In the template:
{{{
{% for t in totals.values %}
{{ t }}
{% endfor %}
}}}
Results in
{{{
$ python manage.py runserver 0.0.0.0:8000 --settings=xxx.settings_debug
Validating models...
0 errors found
July 30, 2014 - 09:57:05
Django version 1.6.5, using settings 'xxx.settings_debug'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
Traceback (most recent call last):
File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run
self.result = application(self.environ, self.start_response)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/contrib/staticfiles/handlers.py", line 67, in __call__
return self.application(environ, start_response)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/core/handlers/wsgi.py", line 206, in __call__
response = self.get_response(request)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/core/handlers/base.py", line 194, in get_response
response = self.handle_uncaught_exception(request, resolver,
sys.exc_info())
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/core/handlers/base.py", line 229, in
handle_uncaught_exception
return debug.technical_500_response(request, *exc_info)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/views/debug.py", line 69, in technical_500_response
html = reporter.get_traceback_html()
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/views/debug.py", line 324, in get_traceback_html
return t.render(c)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/base.py", line 140, in render
return self._render(context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/base.py", line 134, in _render
return self.nodelist.render(context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/base.py", line 840, in render
bit = self.render_node(node, context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/debug.py", line 78, in render_node
return node.render(context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/defaulttags.py", line 305, in render
return nodelist.render(context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/base.py", line 840, in render
bit = self.render_node(node, context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/debug.py", line 78, in render_node
return node.render(context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/defaulttags.py", line 36, in render
output = self.nodelist.render(context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/base.py", line 840, in render
bit = self.render_node(node, context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/debug.py", line 78, in render_node
return node.render(context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/defaulttags.py", line 212, in render
return nodelist.render(context)
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/template/base.py", line 844, in render
return mark_safe(''.join(bits))
File "/home/vagrant/venv/local/lib/python2.7/site-
packages/django/utils/safestring.py", line 116, in mark_safe
return SafeText(s)
MemoryError
[30/Jul/2014 09:57:16] "GET /statistics/order_book_and_wip/ HTTP/1.1" 500
59
}}}
Strangely, iterating over the keys seems to work fine.
Setting the default_factory to None as detailed
[http://stackoverflow.com/a/12842716 here] makes it work as expected. It
would seem like a cheap and sensible workaround to apply that to
defaultdicts. Or otherwise at least raise an exception so users can know
what's going on.
--
Ticket URL: <https://code.djangoproject.com/ticket/16335#comment:19>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/083.47a9786d00c6d4f2670f9198d30dbcac%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.