Django - 在django模板

时间:2016-07-15 15:12:01

标签: python django templates iterable

当迭代我的一个Django模板中的列表时,我试图输入一些if逻辑来说'如果最后的项'类型'值等于loop'type'值中的当前项,但似乎在Django模板中不允许使用python语法。我知道我可以使用{{forloop.counter}},但我似乎无法使用该计数器从我的列表中获取特定索引处的项目。

HTML

{% for repair in repairs %}
    {% if repairs[{{ forloop.counter - 1}}].type == repair.type %}<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ repair.type }}</h2></div>{% endif %}
    <div class="col-sm-6">
        <label>
            <input type="checkbox" name="{{ repair }}">
        {{ repair }}</label>
    </div>
{% endfor %}

{% for index, repair in enumerate(repairs) %}
    {% if repairs[index - 1].type == repair.type%}<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ repair.type }}</h2></div>{% endif %}
    <div class="col-sm-6">
        <label>
            <input type="checkbox" name="{{ repair }}">
        {{ repair }}</label>
    </div>
{% endfor %}

3 个答案:

答案 0 :(得分:1)

您的代码存在多个问题。

Justin所述,Django模板不允许您使用list[index]之类的内容访问列表元素。相反,你应该做list.index

Django模板引擎无法确定变量的类型。但是,您可以实现模板过滤器并使用它来确定变量的类型,如this答案中所述。

此外,您应该{{ forloop.counter - 1}}而不是{{ forloop.counter0 - 1}}forloop.counter给出循环的1索引迭代,而forloop.counter0给出循环的0索引迭代。

所以你的最终代码应该是这样的:

from django import template

register = template.Library()

@register.filter
def get_type(value):
    return type(value)

{% for repair in repairs %}
    {% if repairs.{{ forloop.counter0 - 1}}|get_type == repair|get_type %}
        <div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;">
            <h2>{{ repair|get_type }}</h2>
        </div>
    {% endif %}
    <div class="col-sm-6">
        <label>
            <input type="checkbox" name="{{ repair }}">
                {{ repair }}
        </label>
    </div>
{% endfor %}

修改:在您澄清后,该类型&#39;实际上是变量的一个属性,这是你的代码应该是:

{% for repair in repairs %}
    {% if repairs.{{ forloop.counter0 - 1}}.type == repair.type %}
        <div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;">
            <h2>{{ repair.type }}</h2>
        </div>
    {% endif %}
    <div class="col-sm-6">
        <label>
            <input type="checkbox" name="{{ repair }}">
                {{ repair }}
        </label>
    </div>
{% endfor %}

当然,Daniel建议的方法是更好的方法。

答案 1 :(得分:1)

您应该可以使用ifchanged

{% for repair in repairs %}
    {% ifchanged repair.type %}<div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ repair.type }}</h2></div>{% endifchanged %}
    ...
{% endfor %}

答案 2 :(得分:0)

您的用例regroup

有一个内置模板标记
{% regroup repairs by type as types %}
{% for type in types %}
    <div class="col-sm-12" style="border-top: 1px solid grey; border-bottom: 1px solid grey;"><h2>{{ type.grouper}}</h2></div>
    {% for repair in type.list %}
        <div class="col-sm-6">
            <label>
                <input type="checkbox" name="{{ repair }}">{{ repair }}
            </label>
         </div>
    {% endfor %}
{% endfor %}