zoukankan      html  css  js  c++  java
  • django 模板里面for循环和if常用的方法

    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] view plain copy
     
    1. {% ifequal user currentuser %}  
    2.     <h1>Welcome!</h1>  
    3. {% endifequal %}  


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

    [java] view plain copy
     
    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] view plain copy
     
    1. {% ifequal section 'sitenews' %}  
    2.     <h1>Site News</h1>  
    3. {% else %}  
    4.     <h1>No News Here</h1>  
    5. {% endifequal %}  


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

    [java] view plain copy
     
    1. {% ifequal variable 1 %}  
    2. {% ifequal variable 1.23 %}  
    3. {% ifequal variable 'foo' %}  
    4. {% ifequal variable "foo" %}  


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

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


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

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

    [java] view plain copy
     
    1. {# This is a comment #}  


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

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

    [java] view plain copy
     
    1. {{ name|lower }}  


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

    [java] view plain copy
     
    1. {{ my_text|escape|linebreaks }}  


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

    [java] view plain copy
     
    1. {{ bio|truncatewords:"30" }}  


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

    [java] view plain copy
     
    1. {{ pub_date|date:"F j, Y" }}  


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

    [java] view plain copy
     
      1. Converts & to &amp;amp;  
      2. Converts < to &amp;lt;  
      3. Converts > to &amp;gt;  
      4. Converts "(双引号) to &amp;quot;  
      5. Converts '(单引号) to &amp;#39;  

  • 相关阅读:
    Spring_7_AOP之Advice应用
    JAVA豆知识
    SPRING事务_2
    JSP_5_JavaBean
    Spring事务_1
    java基本类型和包装类型
    SVN使用教程总结
    通过反射来创建对象?getConstructor()和getDeclaredConstructor()区别?
    Java泛型中extends和super的区别?
    数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)
  • 原文地址:https://www.cnblogs.com/guguobao/p/8547090.html
Copyright © 2011-2022 走看看