Django 模板语法

模板渲染过程:

>>>fromdjango.templateimportContext, Template>>> t = Template('My name is {{ name }}.')>>> c = Context({'name':'Stephane'})>>> t.render(c)u'My name is Stephane.'

Contexts

Django里把传给一个渲染模板的信息成为contexts,基本上是一个包含键值对的字典,

在渲染时表表示了一个类似字典的Context对象;

语法:

变量: 双括号 {{obj.name}}

判断:

{% if athlete_list %}

Number of athletes: {{ athlete_list|length }}

{% else %}

No athletes.

{% endif %}

{% ifequal athlete.name coach.name %}

...

{% endifequal %}

{% ifnotequal athlete.name "Joe" %}

...

{% endifnotequal %}

循环:

{% for athlete in athlete_list %}

  • {{ athlete.name }}
  • {% endfor %}

    {% for key, value in data.items %}

    {{ key }}: {{ value }}

    {% endfor %}

    循环中的常量使用(摘自django book):

    forloop.counter 总是一个表示当前循环的执行次数的整数计数器。

    这个计数器是从1开始的,所以在第一次循环时 forloop.counter 将会被设置为1。

    {% for item in todo_list %}

    {{ forloop.counter }}: {{ item }}

    {% endfor %}

    forloop.counter0 类似于 forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。

    forloop.revcounter 是表示循环中剩余项的整型变量。 在循环初次执行时 forloop.revcounter 将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1。

    forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1。

    forloop.first 是一个布尔值。

    在第一次执行循环时该变量为True,在下面的情形中这个变量是很有用的。

    {% for object in objects %}

    {% if forloop.first %}

  • {% else %}
  • {% endif %}
  • {{ object }}

    {% endfor %}

    forloop.last 是一个布尔值;在最后一次执行循环时被置为True。

    一个常见的用法是在一系列的链接之间放置管道符(|)

    {% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}

    上面的模板可能会产生如下的结果:

    Link1 | Link2 | Link3 | Link4

    另一个常见的用途是为列表的每个单词的加上逗号。

    Favorite places:

    {% for p in places %}{{ p }}{% if not forloop.last %}, {% endif %}{% endfor %}

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

    例子在此:

    {% for country in countries %}

    {% for city in country.city_list %}

    Country #{{ forloop.parentloop.counter }}

    City #{{ forloop.counter }}

    {{ city }}

    {% endfor %}

    {% endfor %}

    forloop 变量仅仅能够在循环中使用,在模板解析器碰到 {% endfor %} 标签时, forloop 就不可访问了。 模板的语法分析器在遇到{% endfor %}标签后,就会结束 forloop循环。

     注释:

    单行注释 {# This is a comment #}

    多行注释

    {% comment %}

    This is a

    multi-line comment.

    {% endcomment %}

    模板过滤器

    类似UNIX的管道,使用符号 | 来转换context的变量;

    数据的过滤器:

    apnumber

    对于 1 到 9 的数字,该过滤器返回了数字的拼写形式。 否则,它将返回数字。 这遵循的是美联社风格。

    举例:

    1 变成 one 。

    2 变成 two 。

    10 变成 10 。

    你可以传入一个整数或者表示整数的字符串。

    intcomma

    该过滤器将整数转换为每三个数字用一个逗号分隔的字符串。

    Examples:

    4500 变成 4,500 。

    45000 变成 45,000 。

    450000 变成 450,000 。

    4500000 变成 4,500,000 。

    intword

    该过滤器将一个很大的整数转换成友好的文本表示方式。 它对于超过一百万的数字最好用。

    Examples:

    1000000 变成 1.0 million 。

    1200000 变成 1.2 million 。

    1200000000 变成 1.2 billion 。

    最大支持不超过一千的五次方(1,000,000,000,000,000)。

    ordinal

    该过滤器将整数转换为序数词的字符串形式。

    Examples:

    1 变成 1st 。

    2 变成 2nd 。

    3 变成 3rd 。

    另:

    html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012-08-26 16:00:00,但是页面显示的却是Aug. 26, 2012, 4 p.m.

    为了页面和数据库中显示一致,需要在页面格式化时间,需要添加{{ dayrecord.p_time|date:"Y-m-d H:i:s"}} 类似的过滤器。刷新页面,即可正常显示。


    过滤器相关:

    一、形式:小写

    {{ name | lower }}

    二、串联:先转义文本到HTML,再转换每行到 

     标签

    {{ my_text|escape|linebreaks }}

    三、过滤器的参数

    显示前30个字

    {{ bio | truncatewords:"30" }}

    格式化

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

    过滤器列表

    {{ 123|add:"5" }} 给value加上一个数值

    {{ "AB'CD"|addslashes }} 单引号加上转义号,一般用于输出到javascript中

    {{ "abcd"|capfirst }} 第一个字母大写

    {{ "abcd"|center:"50" }} 输出指定长度的字符串,并把值对中

    {{ "123spam456spam789"|cut:"spam" }} 查找删除指定字符串

    {{ value|date:"F j, Y" }} 格式化日期

    {{ value|default:"(N/A)" }} 值不存在,使用指定值

    {{ value|default_if_none:"(N/A)" }} 值是None,使用指定值

    {{ 列表变量|dictsort:"数字" }} 排序从小到大

    {{ 列表变量|dictsortreversed:"数字" }} 排序从大到小

    {% if 92|divisibleby:"2" %} 判断是否整除指定数字

    {{ string|escape }} 转换为html实体

    {{ 21984124|filesizeformat }} 以1024为基数,计算最大值,保留1位小数,增加可读性

    {{ list|first }} 返回列表第一个元素

    {{ "ik23hr&jqwh"|fix_ampersands }} &转为&

    {{ 13.414121241|floatformat }} 保留1位小数,可为负数,几种形式

    {{ 13.414121241|floatformat:"2" }} 保留2位小数

    {{ 23456 |get_digit:"1" }} 从个位数开始截取指定位置的1个数字

    {{ list|join:", " }} 用指定分隔符连接列表

    {{ list|length }} 返回列表个数

    {% if 列表|length_is:"3" %} 列表个数是否指定数值

    {{ "ABCD"|linebreaks }} 用新行用

     、  标记包裹

    {{ "ABCD"|linebreaksbr }} 用新行用 标记包裹

    {{ 变量|linenumbers }} 为变量中每一行加上行号

    {{ "abcd"|ljust:"50" }} 把字符串在指定宽度中对左,其它用空格填充

    {{ "ABCD"|lower }} 小写

    {% for i in "1abc1"|make_list %}ABCDE,{% endfor %} 把字符串或数字的字符个数作为一个列表

    {{ "abcdefghijklmnopqrstuvwxyz"|phone2numeric }} 把字符转为可以对应的数字??

    {{ 列表或数字|pluralize }} 单词的复数形式,如列表字符串个数大于1,返回s,否则返回空串

    {{ 列表或数字|pluralize:"es" }} 指定es

    {{ 列表或数字|pluralize:"y,ies" }} 指定ies替换为y

    {{ object|pprint }} 显示一个对象的值

    {{ 列表|random }} 返回列表的随机一项

    {{ string|removetags:"br p div" }} 删除字符串中指定html标记

    {{ string|rjust:"50" }} 把字符串在指定宽度中对右,其它用空格填充

    {{ 列表|slice:":2" }} 切片

    {{ string|slugify }} 字符串中留下减号和下划线,其它符号删除,空格用减号替换

    {{ 3|stringformat:"02i" }} 字符串格式,使用Python的字符串格式语法

    {{ "EABCD"|striptags }} 剥去[X]HTML语法标记

    {{ 时间变量|time:"P" }} 日期的时间部分格式

    {{ datetime|timesince }} 给定日期到现在过去了多少时间

    {{ datetime|timesince:"other_datetime" }} 两日期间过去了多少时间

    {{ datetime|timeuntil }} 给定日期到现在过去了多少时间,与上面的区别在于2日期的前后位置。

    {{ datetime|timeuntil:"other_datetime" }} 两日期间过去了多少时间

    {{ "abdsadf"|title }} 首字母大写

    {{ "A B C D E F"|truncatewords:"3" }} 截取指定个数的单词

    {{ "111221"|truncatewords_html:"2" }} 截取指定个数的html标记,并补完整

      {{ list|unordered_list }}
     多重嵌套列表展现为html的无序列表

    {{ string|upper }} 全部大写

    linkage url编码

    {{ string|urlize }} 将URLs由纯文本变为可点击的链接。(没有实验成功)

    {{ string|urlizetrunc:"30" }} 同上,多个截取字符数。(同样没有实验成功)

    {{ "B C D E F"|wordcount }} 单词数

    {{ "a b c d e f g h i j k"|wordwrap:"5" }} 每指定数量的字符就插入回车符

    {{ boolean|yesno:"Yes,No,Perhaps" }} 对三种值的返回字符串,对应是 非空,空,None


    日期格式化参数:

    a 'a.m.' 或 'p.m.' (注意,它与PHP 的输出略有不同.它包括了句点(django扩展). 'a.m.'

    A 'AM' 或 'PM'. 'AM'

    B 未实现.

    d 每月第几天, 带前导零 '01' to '31'

    D 每周第几天,3字母的字符串. 'Fri'

    f 时间, 12-小时制的小时和分钟数, 如果分钟数为零,则不显示.(django 扩展). '1', '1:30'

    F 月份, 长文本格式. 'January'

    g 小时, 12-小时制,没有前导零 '1' to '12'

    G 小时, 24-小时制,没有前导零 '0' to '23'

    h 小时, 12-小时制,有前导零 '01' to '12'

    H 小时, 24-小时制,有前导零 '00' to '23'

    i 分钟. '00' to '59'

    I 未实现

    j 每月第几天, 无前导零 '1' to '31'

    l 每周第几天,长文本格式. 'Friday'

    L 是否闰年. True or False

    m 数字表示的月份,有前导零. '01' to '12'

    M 月份,3字母短文本格式. 'Jan'

    n 数字表示的月份,无前导零 '1' to '12'

    N 出版风格的月份缩写(django 扩展) 'Jan.', 'Feb.', 'March', 'May'

    O 与格林威治的时间差(以小时计) '+0200'

    P 12小时制的小时分钟及'a.m.'/'p.m.' 分钟数若为零则不显示. 用字符串表示特殊 的时间点, 如 'midnight' 和 'noon' (django扩展) '1 a.m.', '1:30 p.m.', 'midnight','noon', '12:30 p.m.'

    r RFC 822 格式的日期 . 'Thu, 21 Dec 2000 16:01:07+0200'

    s 秒数, 带有前导零的数字表示 '00' to '59'

    S 英语序数后缀,用于一个月的第几天,2个字符 'st', 'nd', 'rd' or 'th'

    t 给定月共有多少天. 28 to 31

    T 本机时区. 'EST', 'MDT'

    U 未实现

    w 一周中的第几天,没有前导零的数字 '0' (Sunday) to '6' (Saturday)

    W ISO-8601 一年的第多少星期数, 一周从 星期一开始 1, 23

    y Year, 2 位数字表示 '99'

    Y Year, 4 位数字表示 '1999'

    z 一年中的第几天 . 0 to 365

    Z 以秒计的时区偏移量. 这个偏移量对UTC西部 时区总是负数,而对UTC东部时区则总是正数 -43200 to 43200

    模板继承

    {% extends "test1.html"%}

    模板包含:

    {% include "test1.html"%}

     其他 :

    1、带有alter_data 标记的方法在模板中将不被执行:

    defdelete(self):# Delete the accountdelete.alters_data =True

    如果模板文件里包含了 {{ account.delete }} ,对象又具有 delete()方法,而且delete() 有alters_data=True这个属性,那么在模板载入时, delete()方法将不会被执行。 它将静静地错误退出。 

    2、捷径

    fromdjango.shortcutsimportrender_to_responseimportdatetimedefcurrent_datetime(request):now = datetime.datetime.now()returnrender_to_response('current_datetime.html', {'current_date': now})

    同:

    使用django的自动模板加载,需要配置 TEMPLATE_DIRS。

    fromdjango.template.loaderimportget_templatefromdjango.templateimportContextfromdjango.httpimportHttpResponseimportdatetimedefcurrent_datetime(request):now = datetime.datetime.now()    t = get_template('current_datetime.html')    html = t.render(Context({'current_date': now}))returnHttpResponse(html)

    不用使用模板自动加载,

    fromdjango.templateimportTemplate, Contextfromdjango.httpimportHttpResponseimportdatetimedefcurrent_datetime(request):now = datetime.datetime.now()# Simple way of using templates from the filesystem.# This is BAD because it doesn't account for missing files!fp = open('/home/djangouser/templates/mytemplate.html')    t = Template(fp.read())    fp.close()    html = t.render(Context({'current_date': now}))returnHttpResponse(html)

    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 214,922评论 6 497
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 91,591评论 3 389
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 160,546评论 0 350
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 57,467评论 1 288
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 66,553评论 6 386
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 50,580评论 1 293
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 39,588评论 3 414
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 38,334评论 0 270
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 44,780评论 1 307
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 37,092评论 2 330
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 39,270评论 1 344
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 34,925评论 5 338
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 40,573评论 3 322
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 31,194评论 0 21
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 32,437评论 1 268
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 47,154评论 2 366
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 44,127评论 2 352