如何使用 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 的键无关。

我的最终目标是访问数组中字典中的namevalue

【问题讨论】:

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 模板中的键的主要内容,如果未能解决你的问题,请参考以下文章

Django学习-8-模板渲染的一些特性

Django模板语言-Tags

如何为所有动态生成的 div 添加常用的 Javascript 函数? [复制]

for循环中的Django模板多维数组访问

循环中的 Django 计数器以索引列表

Django中的tags,母版和继承,组件,静态文件相关,自定义simpletag和自定义inclusion_tag