#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.

Reply via email to