在Django模板中用一行代码遍历字典的字典
我传给Django模板的字典里有两个字典,每个字典里面都有一个列表:
'nav_dict': {
'class_name': ['Chemical', 'Avian', 'Mammal'],
'tab_label': ['Chemical!', 'Avian!', 'Mammal!']
}
我想要遍历每个字典里的列表,来填充这行代码:
<li class="{{ item_className }} tabSel">{{ item_tabLabel }}</li>
其中 item_className
是 class_name
列表里的每一个值,而 item_tabLabel
是 tab_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 %}