Thanks for kind expatiation. I can understand why the error occured
easily.

But, it seems that templates' "." has to resolve dir(default_dict)
first before dictionary lookup.
Anyway, I glad to know the reason. Thanks.

Hyungyong Kim


On 11월7일, 오후10시18분, "Karen Tracey" <[EMAIL PROTECTED]> wrote:
> On Fri, Nov 7, 2008 at 2:51 AM, Hyungyong Kim <[EMAIL PROTECTED]> wrote:
>
> > Hi,
>
> > Since a few hours ago, I've suffered following problem.
> > I found this problem is due to collections.defaultdict.
>
> > Normal dictionary is working collectly, but defaultdict is not
> > working.
>
> > >>> from django.template import Template, Context
> > >>> t = Template("{% for k,v in data.items %}{{ k }}: {{ v }}{% endfor %}")
> > >>> normal_dict = {'a':1, 'b':2}
> > >>> t.render(Context({'data':normal_dict}))
> > u'a: 1b: 2'
>
> > >>> from collections import defaultdict
> > >>> default_dict = defaultdict(int)
> > >>> default_dict[1]+=1
> > >>> default_dict[2]+=1
> > >>> default_dict[1]+=1
> > >>> default_dict
> > defaultdict(<type 'int'>, {1: 2, 2: 1})
> > >>> t.render(Context({'data':default_dict}))
> > Traceback (most recent call last):
> >  File "<stdin>", line 1, in <module>
> >  File "/usr/lib/python2.5/site-packages/django/template/__init__.py",
> > line 176, in render
> >    return self.nodelist.render(context)
> >  File "/usr/lib/python2.5/site-packages/django/template/__init__.py",
> > line 768, in render
> >    bits.append(self.render_node(node, context))
> >  File "/usr/lib/python2.5/site-packages/django/template/debug.py",
> > line 81, in render_node
> >    raise wrapped
> > django.template.TemplateSyntaxError: Caught an exception while
> > rendering: 'int' object is not iterable
>
> > Original Traceback (most recent call last):
> >  File "/usr/lib/python2.5/site-packages/django/template/debug.py",
> > line 71, in render_node
> >    result = node.render(context)
> >  File "/usr/lib/python2.5/site-packages/django/template/
> > defaulttags.py", line 122, in render
> >    values = list(values)
> > TypeError: 'int' object is not iterable
>
> This is due to the interaction between the way in which Django attempts to
> resolve variables containing dots in templates 
> (seehttp://docs.djangoproject.com/en/dev/topics/templates/#variables) and the
> fact that when you attempt to access a non-existent key in a defaultdict
> (that has a default_factory like you have specified) it automatically gets
> created.  So, Django's first attempt to resolve data.items is a dictionary
> lookup of 'items' in your default dict (default_dict['items']), and instead
> of failing it returns the default value of 0.  Since the dictionary acess
> attempt works, Django goes ahead and attempts to use the returned value
> instead of moving on an trying the other lookup methods.
>
> Karen
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to