我使用自定义窗口小部件来修改窗口小部件模板的上下文(添加更多信息)。
上下文:
'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
内每个数组的长度,示例中的'path'数组。
所选数组中的值告诉我稍后添加属性的位置与depth_levels的键无关。
我的最终目标是访问阵列中字典中的name
,value
。
答案 0 :(得分:2)
您可以添加这样的过滤器(了解更多: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 %}
答案 1 :(得分:0)
如果你的最终目标是访问数组中字典中的每个名称,那么你应该这样做。
php