Django模板访问嵌套数据
Posted
技术标签:
【中文标题】Django模板访问嵌套数据【英文标题】:Django template access to nested data 【发布时间】:2010-12-25 20:23:40 【问题描述】:这看起来很傻,但我不明白 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']
【问题讨论】:
aDictionary
是否有像 'i_am_a_key'
这样的键 - 即 i_am_a_key
是您的模板可以访问的变量的名称,还是字符串文字?如果它是字符串文字,那么这就是您的区别,因为 key
是存储您的密钥的变量的名称。
为什么要围绕键进行迭代?是什么阻止您简单地遍历字典本身?
因为我想在不改变传递给模板的数据结构的情况下改变数据检索的键。而且我更容易确保通过使用映射结构来检索正确的值,而不是确保所有值都以正确的顺序存储在列表或元组中。
【参考方案1】:
这是一种不同的方法,但根据您要完成的任务,这是我要采取的角度。
如果您想保留某个字典的子集,并且想以某种有序的方式迭代它的值,我会将您感兴趣的元素复制到 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
【讨论】:
谢谢。我可能会用它来解决手头的问题。【参考方案2】:这是 Django 模板语言的一个基本限制。
三种解决方案:
-
使用
% for key,value in foo.items %
获取键和值。
使用Jinja2 -- 一个几乎类似于 Django 的模板系统。
使用expr djangosnippet 进行访问数学运算。
【讨论】:
所以模板不能即时访问字典?我认为 Django 很棒,但我希望能更清楚地记录这个限制。 简短回答:不。解释是它是一种故意限制性的编程语言,因此“模板设计者”不会......什么。就个人而言,我从来没有遇到过“模板设计者”,只是因为实际的设计者无法处理嵌套包含、for 循环等而必须进行模板编程的程序员。它确实倾向于迫使您将业务逻辑排除在外模板。我推荐上面的选项 2 或 3。 Jinja2 为您提供了所有的 Python,expr 标签在 Django 的模板标签框架中做同样的事情。 谢谢。我可能会采用 brianz 的方法——选择我需要的数据并放入一个对象,然后将其传递给模板,而不是尝试选择模板中的数据项。我想它是 kludgier,但应该服务,并且不会那么难读。【参考方案3】:不是同一个问题,但答案类似于#844746。
你最终得到一个你可以做的过滤器......
% load getattribute %
% for key in keys_list %
aDictionary|attr:key
% endfor %
【讨论】:
看到了。我宁愿避免编写自定义标签。 嗯。如果您不喜欢自定义标签/过滤器,最好切换到 Jinja。编写自定义标签和过滤器是您使 Django 模板语言满足您的需求的方式。 您可能是对的,但我正在平衡“学习新工具/找到最优雅的解决方案”与“完成工作”。以上是关于Django模板访问嵌套数据的主要内容,如果未能解决你的问题,请参考以下文章