您的位置:首页 > 编程语言 > Go语言

Django边学边记—模板

2021-09-14 16:24 246 查看 https://www.cnblogs.com/wenshi

功能

  • 产生html,且不仅仅是一个html 包含: 静态内容:html,css,js
  • 动态内容:模板语言

使用

  • 一般使用 Django中提供的简写函数render调用模板
  • render(request,'XXX.html',{XX,XX})

 模板语言(DTL)

  • 变量

  • 语法:{{ 变量 }}
  • 变量名必须由字母、数字、下划线(不能以下划线开头)和点组成        
  • 解析顺序:当变量中有点.的时候 解析顺序如下: 把点前面的部分当成字典,点后面的当成key
  • 把点前面的当成对象,点后面的当成属性
  • 把点前面的当成对象,点后面的当成对象的方法
  • 如果点后面数字,把点前面当成列表,点后面当成下标
  • 都取不到值,就将变量设为空字符串
  • 标签(tags)

  • 语法:{%  代码段  %}
      for标签 {%for item in 列表%}
    • 循环逻辑
    •  {{forloop.counter}}表示当前是第几次循环,从1开始
    • {%empty%}
    • 列表为空或不存在时执行此逻辑
    • {%endfor%}
  • if标签
      {%for item in 列表%}
    •  循环逻辑
    • {{forloop.counter}}表示当前是第几次循环,从1开始
    • {%empty%}
    • 列表为空或不存在时执行此逻辑
    • {%endfor%} 
  • 比较运算符如下:==、!=、<、>、<=、>=
      注意:运算符左右两侧必须有空格
  • 布尔运算符如下:and、or、not
  • 过滤器(filter)

  • 对常量进行一些操作,可以用过滤器,语法如下:
  • 变量|过滤器:参数
  • 常用的过滤器有:date,default,length等,具体可参考Django文档
  • 内置模板标签和过滤器 | Django 文档 | Django https://docs.djangoproject.com/zh-hans/3.2/ref/templates/builtins/#ref-templates-builtins-filters
  • 自定义模板标签和过滤器

       共需要5步
    1.  在应用中创建templatetags目录。(添加 
      templatetags
       模块后,需要重启服务器)
    2. 在上面目录中创建__init__.py 和模块名.py 文件。(要自定义的 tags或filters模块)
    3. 导入模块,创建一个Library对象,用于装饰自定义的过滤器
      from django import template
      register = template.Library()
    4. 编写自定义的函数,并用上面装饰器进行装饰注册。(函数至少接受1个最多接受2个参数)
      @register.filter
      def XXX(num,[]):
      return XXX
       
    5. 在html模板中加载自定义的过滤器
      {% load 模块名 %}
  • 注释

  • 在模板中使用模板注释,注释的代码不会被编译,不会输出到客户端;与html注释不同的是html注释只能注释html内容,不能注释模板语言,且会输出到客户端。
      单行注释语法:  {#...#} 
    1. 多行注释使用comment标签,语法:{%comment%}
      ...
      {%endcomment%}

     模板继承

    • 主要是为了提高代码重用,减轻开发人员的工作量
    • 典型应用:网站的头部、尾部信息

    父模板

    • 如果发现在多个模板中复制一段代码,那就应该把这段内容定义到父模板中
    • 标签block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同
    • 为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block名字相同
    • 父模板中也可以使用上下文中传递过来的数据
    {%block 名称%}
    预留区域,可以编写默认内容,也可以没有默认内容
    {%endblock  名称%}

    子模板

    • 标签extends:继承,写在子模板文件的第一行
    {% extends "父模板名称.html"%}
    • 子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值
    • 填充父模板中指定名称的预留区域
    {%block 名称%}
    实际填充内容
    {{block.super}}用于获取父模板中block的内容
    {%endblock 名称%}

    HTML转义

    • 出于安全考虑,模板对上下文传递的字符串进行输出时,会对以下字符自动转义

      小于号< 转换为&lt;

      大于号> 转换为&gt;

      单引号' 转换为&#39;

      双引号" 转换为 &quot;

      与符号& 转换为 &amp;

    • 关闭转义主要有2种方法:

      单个变量可以用过滤器safe:{{变量|safe}}
    • 设置一段代码都禁用转义,使用标签autoescape:接受on、off参数

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

    CSRF

    • CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。
    • 重要信息如金额、积分等,采用POST方式传递
    • 启用CSRF中间件,默认启用
    • 在form表单中加入标签{% csrf_token  %}
    • 如果不个别视图关闭csrf验证可以用装饰器
    • from django.views.decorators.csrf import csrf_exempt
      
      @csrf_exempt
      def getip(request):
      pass

    反向解析

    • 作用:

      从相应的 Django 视图标识以及要传递给它的参数来获取相关联的 URL 
    • 当一个url配置的地址发生改变时,页面上使用反向解析生成地址的位置不需要变化
  • 实现步骤

      在 项目/urls.py 中为include定义namespace属性
      url(r'^',include('app.urls',namespace='app'))
    • 在app/urls.py中 设置app名字
      app_name = 'app'
    • 在app/urls.py中为url定义name属性
      url(r'^test/$', views.test,name='test')
  • 使用

  • 在模板里:使用 url 模板标签。{%url 'namespace:name'  [a[=x]  b[=x]] %}
  • 在 Python 编码:使用 reverse() 函数。reverse('namespace:name', kwargs={'a':x,'b':y})
      reverse 函数导入
      from django.urls import reverse

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: