我传递给Django模板的字典包含2个字典,每个字典都有一个列表:
'nav_dict': {
'class_name': ['Chemical', 'Avian', 'Mammal'],
'tab_label': ['Chemical!', 'Avian!', 'Mammal!']
}
我想循环遍历每个dict中的列表以填写这行代码:
<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 %}
答案 0 :(得分:2)
问题在于您呈现数据的方式。
为什么不像这样创建字典,其中每个键都是类名,关联值是标签。它更具语义性和可读性。
'nav_dict': {
'Chemical': 'Chemical!',
'Avian': 'Avian!',
'Mammal': 'Mammal!,
}
然后你可以循环遍历它并将键作为class属性放置,并将值作为label属性。
{% 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 %}
如果您只想在字符串中添加感叹号以创建标签,您当然可以创建自定义模板filter - 或者只是在模板内附加感叹号。
答案 1 :(得分: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 %}