【问题标题】:How can I use the forloop.counter0 as a key in Django Template如何使用 forloop.counter0 作为 Django 模板中的键
【发布时间】: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 可能有帮助
  • ^看第二个答案
  • @Laur Ivan - 我的情况不同我不需要访问 {{forloop.counter}} 作为默认值或他的父母(我可以这样做没有问题),而是像使用它一样字典的键
  • @Sayse forloop.counter 不用作列表的索引,但它用作字典的键(如在另一篇文章中)。使用 '。' to access 是 Django 模板访问字典的默认方式,这就是为什么我不明白为什么它不起作用。如果我使用“0”、“1”,而不是“动态”,它会起作用

标签: django django-templates


【解决方案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}}的原因。目标是根据选定长度的数组访问名称,而不是全部访问。
  • 提供您想要的样本输出。从你的问题来看,你想要什么非常不清楚。
猜你喜欢
  • 2018-12-03
  • 2016-10-14
  • 2016-04-05
  • 1970-01-01
  • 2022-06-25
  • 2023-03-19
  • 2019-01-17
  • 1970-01-01
相关资源
最近更新 更多