django模板语法迭代两个列表

时间:2011-04-03 23:36:17

标签: python django google-app-engine

我有以下django模板,在我迭代列表(class_list_overall)时,我想在另一个列表(forloop.counter0)中使用classTimeSlots作为索引。它只是给我一个TemplateSyntaxError。我尝试了以下变化:

  1. {{classTimeSlots.{{forloop.counter0}}}}
  2. {{classTimeSlots.[forloop.counter0]}}
  3. {{classTimeSlots.{forloop.counter0}}}
  4. {{classTimeSlots.(forloop.counter0)}}
  5. {{classTimeSlots.forloop.counter0}}
  6. {% with forloop.counter0 as index%} <legend>{{ classTimeSlots.index}}</legend> {% endwith %}
  7. 其中没有一个有效。有什么建议?我只是DJango的新手。我正在使用Google App Engine。

    这是代码片段(我知道它效率低下,但我一直在尝试不同的事情):

    {% for class_list in class_list_overall %}
        <fieldset> <legend>{{ classTimeSlots.forloop.counter0 }}</legend>
            <ul>
                <li> <label>First Choice </label>
                    <select class="dropdown" name="class{{forloop.counter}}1" size="1">
                        <option value="Click Here to Choose" selected="selected">Click Here to Choose</option>
                        {% for class in class_list %}
                            <option>{{class}}</option>
                        {% endfor %}
                    </select>
                </li>
                <li> 
                    <label>Second Choice </label>
                    <select class="dropdown" name="class{{forloop.counter}}2" size="1">
                        <option value="Click Here to Choose" selected="selected">Click Here to Choose</option>
                        {% for class in class_list %}
                            <option>{{class}}</option>
                        {% endfor %}
                    </select>
                </li>
            </ul>
        </fieldset>
    {% endfor %}
    

3 个答案:

答案 0 :(得分:2)

简短回答:你做不到。

模板语言不会尝试确定以点语法传递的变量的值。

它将对forloop.counter0

进行文字查找

1:编写一个接受变量和密钥的模板标记,并让它返回variable[key]

2:这很可能在视图中完成。我能看到吗?

答案 1 :(得分:2)

Django不支持这一点 - 它是故意限制的。相反,您应该将视图函数修改为zip两个列表,并将其传递给模板。

答案 2 :(得分:0)

它可能但不值得推荐:

{% for class_list in class_list_overall %}
<fieldset> <legend>
   {% for cts in classTimeSlots %}
    {% ifequal forloop.counter forloop.parentloop.counter %} {{cts}} 
    {% endifequal %} 
   {% endfor %} </legend>
    <ul>
        <li> <label>First Choice </label>
            <select class="dropdown" name="class{{forloop.counter}}1" size="1">
                <option value="Click Here to Choose" selected="selected">Click Here to Choose</option>
                {% for class in class_list %}
                    <option>{{class}}</option>
                {% endfor %}
            </select>
        </li>
        <li> 
            <label>Second Choice </label>
            <select class="dropdown" name="class{{forloop.counter}}2" size="1">
                <option value="Click Here to Choose" selected="selected">Click Here to Choose</option>
                {% for class in class_list %}
                    <option>{{class}}</option>
                {% endfor %}
            </select>
        </li>
    </ul>
</fieldset>{% endfor %}

但最好将列表纳入父词典:

[class_list_overall[i].update({'label':classTimeSlots[i]}) for i in range(0,len(classTimeSlots))]

然后将上面的代码更改为:

<legend>
   {{ class_list.label }}
</legend>