搞定 Django 模板内置标签!

百家 作者:程序人生 2019-10-01 03:23:11

作者 | 单雨

责编 | 胡巍巍

出品 | 程序人生(ID:coder_life)

1.debug

概述?:

输出整体的调试信息,包括当前上下文和导入的模块。示例:

django
{%?for?o?in?list?%}
????

class="{%?cycle?'row_blue'?'row_green'?as?rowcolor?silent?%}">div>
????{%?debug?%}
{%?endfor?%}

这个标签会输出非常多的信息,通常只有前几行是有用的,如图:

2.filter?

概述?:

对包含在其中的内容进行过滤。用法:

django
{%?filter?force_escape?%}
???{需要转义的内容}
{%?endfilter?%}

传入参数:

filter标签可以传入参数,比如上述的force_escape(强制转义),可以传入多个参数,参数之间通过“|”进行分隔:

django
{%?filter?force_escape|upper?%}
???{需要转义的内容}
{%?endfilter?%}

传入参数`{“myname”:"jack"}`渲染效果:

小写字母经过过滤变成了大写。?

3. firstof?

概述?:

输出第一个不是False,不是空值或数字0的值,如果所有的值都是False,空值或者数字0就什么都不输出。使用示例:

django
{%?firstof?a1?a2?a3?a4?a5?a6?%}

传入参数:

`python
{
????????"myname":?"jack",
????????"a1":?False,
????????"a2":?0,
????????"a3":?"",
????????"a4":?True,
????????"a5":?1,
????????"a6":?"a6"
}

渲染效果:

?

可见第一个不是False的变量是a4。?

返回默认字符串?:

firstof标签也可以设置一个在所有值都是False的情况下返回的字符串。示例:

django
{%?firstof?a1?a2?a3?"所有值都是空值"?%}

渲染效果:

?

关闭HTML转义:

默认情况下,输出的变量内容和这个返回的字符串会自动进行HTML转义,如果想要显示一些特别的提示效果,比如红色的警告信息,可以这样:

django
{%?autoescape?off?%}
????{%?firstof?a1?a2?a3??"< span?style='color:red;'>所有值都是空值< span>"?%}
{%?endautoescape?%}

渲染效果:

这样所有的输出的变量和返回的默认字符串都不会进行自动HTML转义。?

如果只想其中的一些变量或者默认字符串不被转义,可以使用safe过滤器。示例:

django

????{%?firstof?a1|safe?a2?a3??"< span?style='color:red;'>所有值都是空值< span>"|safe?%}

只有a1和默认字符串不会被转义。

假如`"a1":"""`渲染效果:

?

可以看到变量a1没有执行HTML转义,被当做HTML代码执行了。?

输出保存到变量

firstof标签的输出也可以存储在一个变量中,用法:?

django
{%?firstof?a1?a2?a3??as?not_false_value?%}
{{??not_false_value?}}

渲染效果:

4.for?

概述

循环数组中的每个项,使该项在上下文变量中可用。例如展示一个列表:

django
< ul>
{%?for?city?in?city_list?%}
????< li>{{?city?}}li>
{%?endfor?%}
ul>

传入参数`{"city_list":['北京','上海','哈尔滨','沈阳'']}`,渲染效果:

倒序渲染:

django
< ul>
{%?for?city?in?city_list?reversed?%}
????< li>{{?city?}}li>
{%?endfor?%}
ul>

效果:

?

渲染嵌套列表:

如果需要渲染嵌套列表,可以把子列表的项解压为单独的变量,比如渲染两只球队人员名单,每队有三个成员:

django

{%?for?member1,member2,member3?in?team_list?%}
????


  • ????????{{?member1?}},{{?member2?}},{{?member3?}}
    ????

  • {%?endfor?%}

    传入参数`"team_list": [["乔丹", "詹姆斯", "哈登"], ["达尼尔", "杰斯", "本杰明"]]`,

    渲染效果:?

    渲染字典:

    for标签也可以渲染字典,比如渲染产品价格信息:

    django
    {%?for?product,?price?in?data.items?%}
    ????

  • {{?product?}}:?{{?price?}}

  • {%?endfor?%}


    注意:对于点操作符,字典键查找优先于方法查找。如果渲染的字典中包含一个名为“items”的键,则为products.items将返回products['items'],而不是products.items。如果希望在模板中使用字典方法(项、值、键等),应该避免使用类似字典方法的键。?

    for标签内置变量:

    for标签内置变量的用法和普通变量一样。?

    - forloop.counter:当前迭代项的索引,从1开始。

    django
    ??{%?for?product,?price?in?products.items?%}
    ??????

  • {{?product?}}:?{{?price?}}

  • ??????{{?forloop.counter}}{替换这个变量得到后面例子的渲染效果}
    ??{%?endfor?%}

    - forloop.counter0:当前迭代项的索引,从0开始。

    - forloop.revcounter:从循环项的末尾开始索引到1。?

    - forloop.revcounter0:从循环项的末尾开始索引到0。

    - forloop.first:如果是第一经过循环,则为True。?

    - forloop.last:如果是最后一次经过循环,则为True。?

    - forloop.parentloop:在嵌套循环中,获取当前循环的父循环。forloop.parentloop还可以用点表示法引用内置循环变量,比如:forloop.parentloop.counter、forloop.parentloop.revcounter、forloop.first。效果示例:?

    使用forloop.parentloop.counter父循环的当前索引。

    django
    ??{%?for?value?in?categorys.values?%}
    ??????{%?for?k,?v?in?value.items?%}
    ??????????

  • {{?k?}}:?{{?v?}}

  • ??????????{{?forloop.parentloop.counter}}
    ??????{%?endfor?%}
    ??{%?endfor?%}

    传入参数:`"categorys": {"products": {"car": "¥300000", "engine": "¥200000", "tyre": "¥2000"},"sales_volume":{"car":1000,"engine":500,"tyre":20000}, }`

    渲染效果:


    5.for...empty?

    概述:

    for标签可以使用一个可选的{% empty %}子句,如果给定数组为空或无法找到,则显示该子句的文本。用法:

    django
    {%?for?product,price?in?products.items?%}
    ????< li>{{product}}:{{price}}li>
    {%?empty?%}
    ????< li>产品列表为空li>
    {%?endfor?%}

    传入参数:`"products": {}`?

    渲染效果:

    ?相当于使用一个if-else判断:

    django
    {%?if?products?%}
    ????{%?for?product,price?in?products.items?%}
    ????????

  • {{product}}:{{price}}

  • ????{%?endfor?%}
    ??{%?else?%}
    ????
  • 产品列表为空

  • ??{%?endif?%}

    作者简介:单雨,90 后工科男,伪文艺青年。目前就读于北京理工大学宇航系,喜欢研究 AI,网络爬虫,微信小程序以及机器人,痴迷于 Coding,睡前必撸码。

    ?热 文?推 荐?
    ?程序员因接外包坐牢 456 天!两万字揭露心酸经历
    ?年薪 170 万阿里 P8 程序员征婚上热搜,程序员婚恋观大曝光!
    ?中台的末路
    ?对话行癫:CTO 最重要的是判断未来!| 人物志

    ?云栖大会|当数据中台遇上智能 看中台“鼻祖”阿里巴巴又有什么新花样?

    ?对比C++和Python,谈谈指针与引用

    ?肖仰华:知识图谱构建的三要素、三原则和九大策略 | AI ProCon 2019

    ?以太坊交易量第一合约FAIRWIN被爆漏洞, 竟是因为这个接口被滥用……
    ?厉害!接班马云的为何是张勇?

    点击阅读原文,即刻阅读《程序员大本营》。

    你点的每个“在看”,我都认真当成了喜欢

    关注公众号:拾黑(shiheibook)了解更多

    [广告]赞助链接:

    四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
    让资讯触达的更精准有趣:https://www.0xu.cn/

    公众号 关注网络尖刀微信公众号
    随时掌握互联网精彩
    赞助链接