循环在Django模板中的字典字典为1行代码

时间:2014-04-09 15:48:30

标签: python django google-app-engine dictionary

我传递给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_nametab_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 个答案:

答案 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 %}