开发者

Django template access to nested data

This seems silly, but I don't understand how Django Templates access nested data in Contexts. I can access the values of dictionaries nested in the context data structure with the . notation -- {{ aDictionary.i_am_a_key }} works fine. But if I try to iterate over a list of keys and get their value from that same dictionary, I get nothing. So

{% for key in keys_list %}{{ aDictiona开发者_StackOverflow社区ry.key }}{% endfor}}

just generates blanks.

What am I missing here? Does Django not support key access to context dictionaries on the fly? Do I need to write a custom tag to do this?

EDIT

My examples assume these data structures:

aDictionary = {'i_am_a_key': 'all good', 'i_am_another_key': 'okay'}
keys_list = ['i_am_a_key', 'i_am_another_key']


This is a fundamental limitation of the Django templating language.

Three solutions:

  1. Use {% for key,value in foo.items %} to get key and value.
  2. Use Jinja2 -- an almost Django-like templating system.
  3. User the expr djangosnippet to do the access math.


It's not the same question, but the answer is similar to #844746.

You end up with a filter which you can do...

{% load getattribute %}
{% for key in keys_list %}
    {{ aDictionary|attr:key }}
{% endfor %}


This is a different approach, but based on what you want to accomplish this is the angle I'd take.

If you want to keep a subset of some dictionary and you want to iterate around it's values in some ordered fashion, I'd copy the element you're interested in into a SortedDict (django/utils/datastructures.py).

In my mind, stuff like this should live in the view (all of this is untested):

sorted_dict = SortedDict()
for key in orig_dict:
    if interested(key):
        sorted_dict[key] = orig_dict[val]

and the templates should just be very dumb:

{% for key, val in sorted_dict.items %}{{ val }}{% endfor}}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜