免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3292 | 回复: 0
打印 上一主题 下一主题

Django中的模板与JSTL对比学习下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-10 10:12 |只看该作者 |倒序浏览

模板标签和过滤器基础
我们已经提到模板系统使用内建的标签和过滤器
这里我们看看常见的,附录6包含了完整的内建标签和过滤器,你自己熟悉那个列表来了解可以做什么是个好主意
if/else
{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值
系统则会显示{% if %}和{% endif %}间的所有内容:
代码

{% if today_is_weekend %}   
  •     p>Welcome to the weekend!p>  {% else %}   
  •     p>Get back to work.p>  {% endif %}  
    {% if %}标签接受and,or或者not来测试多个变量值或者否定一个给定的变量,例如:
    代码

    {% if athlete_list and coach_list %}   
  •      Both athletes and coaches are available.   {% endif %}   
  • {% if not athlete_list %}        There are no athletes.   
  • {% endif %}   {% if athlete_list or coach_list %}   
  •      There are some athletes or some coaches.   {% endif %}   
  • {% if not athlete_list or coach_list %}        There are no athletes or there are some coaches.   
  • {% endif %}   {% if athlete_list and not coach_list %}   
  •      There are some athletes and absolutely no coaches.   {% endif %}  
    {% if %}标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的:
    代码

    {% if athlete_list and coach_list or cheerleader_list %}  
    如果你想结合and和or来做高级逻辑,只需使用嵌套的{% if %}标签即可:
    代码

    {% if athlete_list %}   
  •      {% if coach_list or cheerleader_list %}            We have athletes, and either coaches or cheerleaders!   
  •      {% endif %}   {% endif %}  
    多次使用同一个逻辑符号是合法的:
    代码

    {% if athlete_list or coach_list or parent_list or teacher_list %}  
    没有{% elif %}标签,使用嵌套的{% if %}标签可以做到同样的事情:
    代码

    {% if athlete_list %}   
  •     p>Here are the athletes: {{ athlete_list }}.p>  {% else %}   
  •     p>No athletes are available.p>       {% if coach_list %}   
  •         p>Here are the coaches: {{ coach_list }}.p>       {% endif %}   
  • {% endif %}  
    确认使用{% endif %}来关闭{% if %}标签,否则Django触发TemplateSyntaxError

    for
    {% for %}标签允许你按顺序遍历一个序列中的各个元素
    Python的for语句语法为for X in Y,X是用来遍历Y的变量
    每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容
    例如,显示给定athlete_list变量来显示athlete列表:
    代码

    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 %}  
    系统不支持中断循环,如果你想这样,你可以改变你想遍历的变量来使得变量只包含你想遍历的值
    类似的,系统也不支持continue语句,本章后面的“哲学和限制”会解释设计的原则
    {% for %}标签内置了一个forloop模板变量,这个变量含有一些属性可以提供给你一些关于循环的信息
    1,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1,例如:
    代码

    {% for item in todo_list %}   
  •     p>{{ forloop.counter }}: {{ item }}p>  {% endfor %}  
    2,forloop.counter0类似于forloop.counter,但它是从0开始计数,第一次循环设为0
    3,forloop.revcounter表示循环中剩下的items数量,第一次循环时设为items总数,最后一次设为1
    4,forloop.revcounter0类似于forloop.revcounter,但它是表示的数量少一个,即最后一次循环时设为0
    5,forloop.first当第一次循环时值为True,在特别情况下很有用:
    代码

    {% for object in objects %}   
  •      {% if forloop.first %}li class="first">{% else %}li>{% endif %}        {{ object }}   
  •     li>  {% endfor %}  
    6,forloop.last当最后一次循环时值为True
    代码

    {% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}  
    7,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的变量,Django会用{% for %}标签替代它
    Django会在for标签的块中覆盖你定义的forloop变量的值
    在其他非循环的地方,你的forloop变量仍然可用
    我们建议模板变量不要使用forloop,如果你需要这样做来访问你自定义的forloop,你可以使用forloop.parentloop

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

    {% ifequal user currentuser %}   
  •     h1>Welcome!h1>  {% endifequal %}  
    参数可以是硬编码的string,单引号和双引号均可,下面的代码是合法的:
    代码

    {% ifequal section 'sitenews' %}   
  •     h1>Site Newsh1>  {% endifequal %}   
  • {% ifequal section "community" %}       h1>Communityh1>  
  • {% endifequal %}  
    和{% if %}一样,{% ifequal %}标签支持{% else %}
    代码

    {% ifequal section 'sitenews' %}   
  •     h1>Site Newsh1>  {% else %}   
  •     h1>No News Hereh1>  {% endifequal %}  
    其它的模板变量,strings,integers和小数都可以作为{% ifequal %}的参数:
    代码

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

    {% ifequal variable True %}   
  • {% ifequal variable [1, 2, 3,]%}   {% ifequal variable {'key': 'value'} %  
    如果你需要测试某个变量是true或false,用{% if %}即可

    注释
    和HTML或编程语言如Python一样,Django模板语言允许注释{# #},如:
    代码
    {# This is a comment #}  
    模板渲染时注释不会输出,一个注释不能分成多行
    下面的模板渲染时会和模板中的内容一样,注释标签不会解析成注释
    This is a {# comment goes here
    and spans another line #}
    test.

    过滤器
    本章前面提到,模板过滤器是变量显示前转换它们的值的方式,看起来像下面这样:
    代码
    {{ name|lower }}  
    这将显示通过lower过滤器过滤后{{ name }}变量的值,它将文本转换成小写
    使用(|)管道来申请一个过滤器
    过滤器可以串成链,即一个过滤器的结果可以传向下一个
    下面是escape文本内容然后把换行转换成p标签的习惯用法:
    代码
    {{ my_text|escape|linebreaks }}  
    有些过滤器需要参数,需要参数的过滤器的样子:
    代码

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

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

    Converts & to &   
  • Converts Converts > to >   
  • Converts "(双引号) to "   Converts '(单引号) to '   
    4,length,返回值的长度,你可以在一个list或string上做此操作
    或者在任何知道怎样决定自己的长度的Python对象上做此操作(即有一个__len__()方法的对象)
                   
                   
                   

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/84280/showart_2066875.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP