代码之家  ›  专栏  ›  技术社区  ›  chernevik

Django模板对嵌套数据的访问

  •  3
  • chernevik  · 技术社区  · 15 年前

    这看起来很愚蠢,但我不理解django模板如何在上下文中访问嵌套数据。我可以使用访问嵌套在上下文数据结构中的字典的值。记法 {{ aDictionary.i_am_a_key }} 工作正常。但是如果我试图遍历一个键列表并从同一个字典中获取它们的值,我什么也得不到。所以

    {% for key in keys_list %}{{ aDictionary.key }}{% endfor}}

    只生成空白。

    我这里缺什么?Django是否不支持动态访问上下文词典?我需要写一个自定义标签来完成这个操作吗?

    编辑

    我的示例假设这些数据结构:

    aDictionary = {'i_am_a_key': 'all good', 'i_am_another_key': 'okay'}
    keys_list = ['i_am_a_key', 'i_am_another_key']
    
    3 回复  |  直到 15 年前
        1
  •  5
  •   Peter Rowell    15 年前

    这是Django模板语言的一个基本限制。

    三种解决方案:

    1. 使用 {% for key,value in foo.items %} 获取键和值。
    2. 使用 Jinja2 --一个几乎像姜戈一样的模板系统。
    3. 使用 expr djangosnippet 做访问数学。
        2
  •  3
  •   brianz    15 年前

    这是一个不同的方法,但是基于你想要完成的事情,这是我会采取的角度。

    如果您希望保留某个字典的子集,并且希望以某种顺序的方式对其值进行迭代,那么我将把您感兴趣的元素复制到 SortedDict (django/utils/datastructures.py)。

    在我看来,像这样的东西应该存在于视图中(所有这些都是未经测试的):

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

    模板应该非常愚蠢:

    {% for key, val in sorted_dict.items %}{{ val }}{% endfor}}
    
        3
  •  2
  •   Community miroxlav    7 年前

    这不是同一个问题,但答案与 #844746 .

    最后你会得到一个你可以做的过滤器…

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