django 模板里面for循环常用的方法



{% for %} 允许我们在一个序列上迭代。与Python的for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列
而X是在每一个特定的循环中使用的变量名称。每一次循环中,模板系统会渲染在{% for %} and {% endfor %}中的所有内
容。
例如,给定一个运动员列表athlete_list 变量,我们可以使用下面的代码来显示这个列表:

<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
给标签增加一个reversed 使得该列表被反向迭代:
{% for athlete in athlete_list reversed %}
...
{% endfor %}
可以嵌套使用{% for %} 标签:
{% for country in countries %}
<h1>{{ country.name }}</h1>
<ul> 
{% for city in country.city_list %}
<li>{{ city }}</li>
{% endfor %}
</ul>
{% endfor %}


Django不支持退出循环操作。如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。同
理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。(请参看本章稍后的理念和限制小节,了解下
决定这个设计的背后原因)
{% for %} 标签在循环中设置了一个特殊的 forloop 模板变量。这个变量能提供一些当前循环进展的信息:
forloop.counter 总是一个表示当前循环的执行次数的整数计数器。这个计数器是从1开始的,
所以在第一次循环时forloop.counter 将会被设置为1。例子如下:

{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}


forloop.counter0 类似于 forloop.counter ,但是它是从0计数的。第一次执行循环时这个变量会被设置为0。
forloop.revcounter 是表示循环中剩余项的整型变量。在循环初次执行时 forloop.revcounter 将被设置为序列中项的总
数。最后一次循环执行中,这个变量将被置1。
forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序
列的项的个数减1。在最后一次迭代时,该变量为0。
forloop.first 是一个布尔值。在第一次执行循环时该变量为True,在下面的情形中这个变量是很有用的。

{% for object in objects %}
{% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
{{ object }}
</li>
{% endfor %}


forloop.last 是一个布尔值;在最后一次执行循环时被置为True。一个常见的用法是在一系列的链接之间放置管道符(|)

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
The above template code might output something like this::
Link1 | Link2 | Link3 | Link4


forloop.parentloop 是一个指向当前循环的上一级循环的 forloop 对象的引用(在嵌套循环的情况下)。例子在此:

{% for country in countries %}
<table>
{% for city in country.city_list %}
<tr>
<td>Country #{{ forloop.parentloop.counter }}</td>
<td>City #{{ forloop.counter }}</td>
<td>{{ city }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}


forloop 变量仅仅能够在循环中使用,在模板解析器碰到 {% endfor %} 标签时, forloop 就不可访问了。
Context和forloop变量
在一个{% for %} 块中,已存在的变量会被移除,以避免 forloop 变量被覆盖。Django会把这个变量移动到
forloop.parentloop 中。通常我们不用担心这个问题,但是一旦我们在模板中定义了 forloop 这个变量(当然我们反对这
样做),在{% for %} 块中它会在 forloop.parentloop 被重新命名。

 

 

Django模板系统并不是一个严格意义上的编程语言,所以它并不允许我们执行Python语句
(我们会在‘哲学和限制‘一节详细讨论)。
然而在模板语言里比较两个值并且在他们一致的时候显示一些内容,确实是一个在常见不过的需求了——所以Django提供了ifequal标签。
{% ifequal %}比较两个值,如果相等,则显示{% ifequal %}和{% endifequal %}之间的所有内容:



[java]


    1. {% ifequal user currentuser %}  
    2.     <h1>Welcome!</h1>  
    3. {% endifequal %}




    参数可以是硬编码的string,单引号和双引号均可,下面的代码是合法的:



    [java]

    1. {% ifequal section 'sitenews' %}  
    2.     <h1>Site News</h1>  
    3. {% endifequal %}  
    4. {% ifequal section "community" %}  
    5.     <h1>Community</h1>  
    6. {% endifequal %}



    和{% if %}一样,{% ifequal %}标签支持{% else %}



    [java]

      1. {% ifequal section 'sitenews' %}  
      2.     <h1>Site News</h1>  
      3. {% else %}  
      4.     <h1>No News Here</h1>  
      5. {% endifequal %}




      其它的模板变量,strings,integers和小数都可以作为{% ifequal %}的参数:



      [java]

        1. {% ifequal variable 1 %}  
        2. {% ifequal variable 1.23 %}  
        3. {% ifequal variable 'foo' %}  
        4. {% ifequal variable "foo" %}




        其它的Python类型,如字典、列表或booleans不能硬编码在{% ifequal %}里面,下面是不合法的:



        [java]

          1. {% ifequal variable True %}  
          2. {% ifequal variable [1, 2, 3,]%}  
          3. {% ifequal variable {'key': 'value'} %



          如果你需要测试某个变量是true或false,用{% if %}即可

          注释
          和HTML或编程语言如Python一样,Django模板语言允许注释{# #},如:



          [java]

          1. {# This is a comment #}


          模板渲染时注释不会输出,一个注释不能分成多行
          下面的模板渲染时会和模板中的内容一样,注释标签不会解析成注释
          This is a {# comment goes here
          and spans another line #}
          test.

          过滤器
          本章前面提到,模板过滤器是变量显示前转换它们的值的方式,看起来像下面这样:



          [java]

          1. {{ name|lower }}



          这将显示通过lower过滤器过滤后{{ name }}变量的值,它将文本转换成小写
          使用(|)管道来申请一个过滤器
          过滤器可以串成链,即一个过滤器的结果可以传向下一个
          下面是escape文本内容然后把换行转换成p标签的习惯用法:



          [java]

          1. {{ my_text|escape|linebreaks }}



          有些过滤器需要参数,需要参数的过滤器的样子:



          [java] 


          1. {{ bio|truncatewords:"30" }}



          这将显示bio标量的前30个字,过滤器参数一直使用双引号
          下面是一些最重要的过滤器:
          1,addslashed,在任何后斜线,单引号,双引号前添加一个后斜线
          当你把一些文本输出到一个JavaScript字符串时这会十分有用
          2,date,根据一个格式化string参数来格式化date或datetime对象,例如:



          [java]

          1. {{ pub_date|date:"F j, Y" }}



          格式化string会在附录6定义
          3,escape,避免给定的string里出现and符,引号,尖括号
          当你处理用户提交的数据和确认合法的XML和XHTML数据时这将很有用
          escape将作如下的一些转换:



          [java]

          1. Converts & to &amp;  
          2. Converts < to &lt;  
          3. Converts > to &gt;  
          4. Converts "(双引号) to &quot;  
          5. Converts '(单引号) to &#39;  
          6.