在Django模板中用一行代码遍历字典的字典

1 投票
2 回答
905 浏览
提问于 2025-04-18 02:03

我传给Django模板的字典里有两个字典,每个字典里面都有一个列表:

'nav_dict': {
                'class_name': ['Chemical', 'Avian', 'Mammal'],
                'tab_label': ['Chemical!', 'Avian!', 'Mammal!']
                }

我想要遍历每个字典里的列表,来填充这行代码:

<li class="{{ item_className }} tabSel">{{ item_tabLabel }}</li>

其中 item_classNameclass_name 列表里的每一个值,而 item_tabLabeltab_label 列表里的每一个值。最终的结果会是3个 <li> 标签,每个标签都有一个 class_name 和一个 tab_label

我试过类似这样的代码(这段代码只处理了 class_name 部分),但我无法让循环把结果添加到同一行代码里(每个 <li>):

{% for key, value in nav_dict.items %}
        {% if key == 'class_name' %}

            {% for item_className in value %}
                {% if forloop.counter0 == 0 %}
                    <li class="{{ item_className }} tabSel">{{ item_tabLabel }}</li>
                {% else %}
                    <li class="{{ item_className }} tabUnsel">{{ item_tabLabel }}</li>
                {% endif %}
            {% endfor %}

        {% endif %}
    {% endfor %}

2 个回答

2

你遇到的问题是数据展示的方式不太对。

为什么不这样创建你的字典呢?每个键是类名,关联的值是标签。这样会更有意义,也更容易阅读。

'nav_dict': {
    'Chemical': 'Chemical!',
    'Avian': 'Avian!',
    'Mammal': 'Mammal!,
 }

然后你可以遍历这个字典,把键作为类属性,把值作为标签属性。

{% for key, value in nav_dict.items %}
    {% if forloop.counter0 == 0 %}
        <li class="{{ key }} tabSel">{{ value }}</li>
    {% else %}
        <li class="{{ key }} tabUnsel">{{ value }}</li>
    {% endif %}
{% endfor %}

如果元素的顺序很重要(因为字典是无序的),你可以使用OrderedDict,这个来自collections模块,可以保持插入的顺序。你可以在你的视图中这样做……

>>> from collections import OrderedDict
>>> nav_dict = OrderedDict(zip(['Chemical', 'Avian', 'Mamma!'], ['Chemical!', 'Avian!', 'Mammal!']))
OrderedDict([('Chemical', 'Chemical!'), ('Avian', 'Avian!'), ('Mammal', 'Mammal!')])

同样,你也可以用一个元组的列表作为你的数据。

'nav_list': [('Chemical', 'Chemical!'), ('Avian', 'Avian!'), ('Mammal', 'Mammal!')]

然后像这样遍历这个对象。

{% for class_name, label_name in nav_list %}
    {% if forloop.counter0 == 0 %}
        <li class="{{ class_name }} tabSel">{{ label_name }}</li>
    {% else %}
        <li class="{{ class_name }} tabUnsel">{{ label_name }}</li>
    {% endif %}
{% endfor %}

如果你只想在字符串后面加个感叹号来创建标签,你当然可以创建一个自定义模板过滤器,或者直接在模板里加上感叹号。

1

如果你必须使用那个字典,你可以参考下面的模板代码:

{% for item_className in nav_dict.class_name %}
  {% with forloop.counter0 as index_className %}
    {% for item_tabLabel in nav_dict.tab_label %}
      {% with forloop.counter0 as index_tabLabel %}
        {% ifequal index_className index_tabLabel %}
            {% if index_className == 0 %}
                <li class="{{ item_className }} tabSel">{{ item_tabLabel }}</li>
            {% else %}
                <li class="{{ item_className }} tabUnsel">{{ item_tabLabel }}</li>
            {% endif %}
        {% endifequal %}
      {% endwith %}
    {% endfor %}
  {% endwith %}
{% endfor %}

撰写回答