• 四、Django模板


    1、模板语言

      1.1 模板变量

      模板变量的作用是计算并输出,变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。

      语法:{{变量}}

      当模板引擎遇到点如book.title,会按照下列顺序解析:

      (1)字典book['title']

      (2)先属性后方法,将book当作对象,查找属性title,如果欸有再查找方法title()

      (3)如果是格式为book.0则解析为列表book[0],当变量不存在时则插入空字符串。

      注意:在模板中调用方法时不能传递参数。

      1.2 标签

      语法:{%代码段%}

      for标签语法:

        {%for item in 列表%}

        循环逻辑

        {{forloop.counter}}表示当前是第几次循环,从1开始

        {%empty%}

        列表为空或不存在时执行此逻辑

        {%endfor%}

      if标签语法:

        {%if ...%}

        逻辑1

        {%elif ...%}

        逻辑2

        {%else%}

        逻辑3

        {%endif%}

      比较运算符:==  、!= 、< 、> 、<= 、>=,运算符左右两侧不能紧挨变量或常量,必须有空格。

      布尔运算符:and 、or 、not

      1.3 过滤器

      语法变量 | 过滤器:参数

        (1)使用管道符号|来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中。

        (2)如果过滤器需要参数,则使用冒号:传递参数

      长度length,返回字符串包含字符的个数,或列表、元组、字典的元素个数。

      默认值default,如果变量不存在时则返回默认值。data|default:'默认值'

      

      日期date,用于对日期类型的值进行字符串格式化,常用的格式化字符如下:

      (1)Y表示年,格式为4位,y表示两位的年

      (2)m表示月,格式为01,02,12等

      (3)d表示日, 格式为01,02等

      (4)j表示日,格式为1,2等

      (5)H表示时,24进制,h表示12进制的时

      (6)i表示分,为0-59

      (7)s表示秒,为0-59

      用法:value|date:"Y年m月j日 H时i分s秒"

      1.4 自定义过滤器

        过滤器就是python中的函数,注册后就可以在模板中当作过滤器使用

        (1)在应用中创建templatetags目录,当前示例为"booktest/templatetags",创建_init_文件,内容为空。

        (2)在"booktest/templatetags"目录下创建filters.py文件,代码如下:

    #导入Library类
    from django.template import Library
    
    #创建一个Library类对象
    register=Library()
    
    #使用装饰器进行注册
    @register.filter
    #定义求余函数mod,将value对2求余
    def mod(value):
        return value%2 == 0

        (3)在templates/booktest/temp_filter.html中,使用自定义过滤器。 

    <!--首先使用load标签引入模块-->
    {%load filters%}
    
    ...
    {%for book in list%%}
        {%if book.id|mod%}
            <li>
                ...
            </li>
        {%endif%}
    {%endfor%}    

        (4)过滤器可以接收参数,将booktest/templatetags/filters.py中增加mod_num函数

    #使用装饰器进行注册
    @register.filter
    #定义求余函数mod_num,将value对num求余
    def mod_num(value,num):
        return value%num

        (5)在templates/booktest/temp_filter.html中修改遍历时判断代码。

    <!--首先使用load标签引入模块-->
    {%load filters%}
    
    ...
    {%for book in list%%}
        {%if book.id|mod_num:3%}
            <li>
                ...
            </li>
        {%endif%}
    {%endfor%}  

      1.5 注释

        在模板中使用如下模板注释,这段代码不会被编译,不会输出到客户端;html注释只能注释html内容,不能注释模板语言。

        (1)单行注释语法:{#...#}

          注释可以包含任何模版代码,有效的或者无效的都可以。

           {# { % if foo % }bar{ % else % } #}

        (2)多行注释使用comment标签,语法:

          {%comment%}

          ...

          {%endcomment%}

    2、模板继承

      模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量。典型的应用是:网站的头部、尾部信息。

      2.1 父模板

        如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。

        标签block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。 为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block名字相同。父模板中也可以使用上下文中传递过来的数据。

        {%block 名称%}

        预留区域,可以编写默认内容,也可以没有默认内容

        {%endblock 名称%}

      2.2 子模板

        标签extends:继承,写在子模板文件的第一行。

        {% extends "父模板路径"%}

        子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值。

        填充父模板中指定名称的预留区域。

        {%block 名称%}

        实际填充内容

        {{block.super}}用于获取父模板中block内容

        {%endblock 名称%}

    3、HTML转义

      模板对上下文传递的字符串进行输出时,会对以下字符自动转义。

      (1)小于号 < 转换为 &lt;

      (2)大于号 > 转换为 &gt;

      (3)单引号 ‘ 转换为 &#39;

      (4)双引号 " 转换为 &quot;

      (5)与符号 & 转换为 &amp;

      定义视图:

    def html_escape(request):
        context={'content':'<h1>hello world</h1>'}
        return render(request,'booktest/html_escape.html',context)

      定义模板

    <html>
    <head>
        <title>转义</title>
    </head>
    <body>
    自动转义:{{content}}
    </body>
    </html>

      效果

      

       说明:转义后标签代码不会被直接解释执行,而是被直接呈现,防止客户端通过嵌入js代码攻击网站。

      3.1 关闭转义

        过滤器escape可以实现对变量的html转义,默认模板就会转义,一般省略

        {{t1|escape}}

        过滤器safe:禁用转义,告诉模板这个变量是安全的,可以解释执行

        {{data|safe}}

        标签autoescape:设置一段代码都禁用转义,接受on、off参数

        {%autoescape off%}...{%endautoescape%}

      3.2 字符串字面值

        对于在模板中硬编码的html字符串,不会转义。

      3.3 如果希望出现转义的效果,则需要手动编码转义。

  • 相关阅读:
    C#托盘图标
    线程相关整理
    Quartz.NET 快速入门
    (转)IE内存泄露,iframe内存泄露造成的原因和解决方案
    美化console.log的文本(转载)
    mongoDB学习资料整理
    EF7学习资料整理
    Oracle常用
    Node.js学习资料整理
    【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器(转)
  • 原文地址:https://www.cnblogs.com/nuochengze/p/12750714.html
Copyright © 2020-2023  润新知