如何使用 forloop.counter0 作为 Django 模板中的键
Posted
技术标签:
【中文标题】如何使用 forloop.counter0 作为 Django 模板中的键【英文标题】:How can I use the forloop.counter0 as a key in Django Template 【发布时间】:2018-05-08 08:07:35 【问题描述】:我使用自定义小部件来修改小部件模板的上下文(添加更多信息)。
上下文:
'selected': [[3, 9], [3, 4, 7, 6]], 'depth_levels': 0: ['name': 'Category A', 'value': 3, 'depth': 0, 'parent_id': None, 'children': [4, 9], 'name': 'Category B', 'value': 8, 'depth': 0, 'parent_id': None, 'children': []], 1: ['name': 'Category A_1', 'value': 4, 'depth': 1, 'parent_id': 3, 'children': [5, 7]
% for path in widget.selected %
% for selected in path %
% for level in widget.depth_levels.forloop.counter0 %
level
% endfor %
% endfor %
% endfor %
首先我循环遍历选定的(路径)和内部数组(选定的)。 我想使用 forloop.counter0 作为 depth_levels 的键。
问题:widget.depth_levels.forloop.counter0
不返回任何内容。
forloop.counter 不用作列表的索引,但它用作字典的键。
使用“。”访问是 Django 模板访问字典的默认方式* 使用 '0'、'1' - widget.depth_levels.0
- 等而不是 forloop.counter0
它可以工作。
再次使用自定义模板标签会出现问题,因为访问位于for
内部,无法在内部使用:
% for level in widget.depth_levels.forloop.counter0 %
我需要访问 depth_levels 的键是从 0 到 selected
中每个数组的长度,示例中的“路径”数组。
选择数组中的值告诉我稍后在哪里添加属性与 depth_levels 的键无关。
我的最终目标是访问数组中字典中的name
、value
。
【问题讨论】:
This 可能有帮助 Reference list item by index within Django template?的可能重复 ^看第二个答案 @Laur Ivan - 我的情况不同我不需要访问 forloop.counter 作为默认值或他的父母(我可以这样做没有问题),而是像使用它一样字典的键 @Sayse forloop.counter 不用作列表的索引,但它用作字典的键(如在另一篇文章中)。使用 '。' to access 是 Django 模板访问字典的默认方式,这就是为什么我不明白为什么它不起作用。如果我使用“0”、“1”,而不是“动态”,它会起作用 【参考方案1】:您可以添加这样的过滤器(了解更多:https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/#writing-custom-template-filters):
@register.filter
def value_by_key(d, key):
return d[key]
然后像这样使用它:
% for path in widget.selected %
% for level in widget.depth_levels|value_by_key:path|length %
level
% endfor %
% endfor %
【讨论】:
我需要的键是从0到路径内每个数组的长度,所以选择的不是键,这就是我需要forloop.counter的原因。与您的示例相比,我也更深了一层。 所以你可以用“forloop.counter”代替“selected”(不用倒引号)【参考方案2】:如果您的最终目标是访问数组中字典中的每个名称、值,那么您应该这样做。
% for path in widget.selected %
% for selected in path %
% for key, level in widget.depth_levels.items %
% for key_obj in level %
key_obj.name
key_obj.value
% endfor %
% endfor %
% endfor %
% endfor %
【讨论】:
我需要的键是从0到路径内每个数组的长度,所以选择的不是键,这就是我需要forloop.counter的原因。目标是根据选定长度的数组访问名称,而不是全部访问。 提供您想要的样本输出。从你的问题来看,你想要什么非常不清楚。以上是关于如何使用 forloop.counter0 作为 Django 模板中的键的主要内容,如果未能解决你的问题,请参考以下文章