模板

1. 简介

  • 模板由HTML代码和逻辑控制代码构成
  • 同一个模板,可以有多个上下文,就可以通过穿件模板对象来渲染多个上下文
  • 创建一个模板就可以多次调用render()方法来渲染上下文
  • Django模板解析工作都是在后台通过对正则表达式一次性调用来完成

2. 语法

2.1 模板继承

include(继承) 模板标签

  • {% include %} 是一个内建模板标签,允许在模板中包含其他的模板内容
  • 标签的参数是所要包含的模板的名称,可以是一个变量,也可以是单/爽引号硬编码的字符串
  • 在多个模板中出现相同的代码时,应该考虑使用{% include %}来减少代码重复

extend(继承) 模板标签

1. 定义母版	{% block title %}......{% endblock %}
2. 定义子板
{% extends "base.html" %} <!--继承母版的内容,且必须放在模板第一行-->
{% block title %}{% endblock %} <!--所继承的盒子的内容-->
{% csrf_token %} <!--取消csrf安全保护-->
{{ block.super }} <!--继承父模板中的内容-->
{% include "小组件路径" %} <!--HTML出现相同的代码时,新建公用小组件HTML文件-->
  • 模板继承是先构造一个基础模板,而后在子模板中对部分块进行重载
  • 在模板中使用{% extends %},须保证其为模板中的第一个标记,否则模板不起作用
  • 一个模板中不能定义多个同名的{% block %}
  • block标签的工作方式是双向的,block标签定义了在父模板中{% block %}
  • 父模板中不能出现两个相同名称的{% block %}标签
  • 需要访问父模板中的块的内容,使用{{ block.super }}标签继承父模板中的内容

2.2 模板语言的控制语句

  • for 标签:

    循环遍历可迭代变量中的每一个元素,没有break和continue等复杂功能,相关操作类比python。

    <!--遍历列表-->
    {% for name in name_list %}
    <li>{{ name }}</li>
    {% endfor %}
    <!--反向遍历-->
    {% for name in name_list reversed %}
    <li>{{ name }}</**li**>
    {% endfor %}
    <!--列表中字典取值-->
    {% for info_dic in name_list %}
    <li>{{ info_dic.name }}</li>
    {% endfor %}
    <!--遍历字典-->
    {% for k,v in info_dict.items %}
    <li>{{ k }}:{{ v }}</li>
    {% endfor %}
  • for…empty…:

    for遍历一个空的变量或者未找到时执行empty

    {% for info_dic in name_list %}
    <li>{{ info_dic.name }}</li>
    {% empty %}
    <p>给出的变量为空或者未找到!</p> 
    {% endfor %}
  • if 标签:

    ​ 判断变量的逻辑值是进行选择性的输出,前后必须要有空格

    ​ 类比python < = > <= >= != == and or not not in is is not

    {% if num > 100 %}
    <h1>大于100</h1>
    {% elif num < 100 %}
    <h1>小于100</h1>
    {% else %}
    <h1>等于100</h1>
    {% endif %}
  • with 标签:

    ​ 多用于给一个复杂的变量起别名

    ​ 注意:等号左右不要加空格。

    {% with total=business.employees.count %}
    {{ total }} <!--只能在with语句体内用-->
    {% endwith %}
    <!--或-->
    {% with business.employees.count as total %}
    {{ total }}
    {% endwith %}
  1. url语句

    url标签中使用模板变量和普通标签参数一样,空格隔开,{{ % url 别名 %}}即可。

    {% url 'index' %} <!--映射到name为index的请求路径-->
  2. load语句

    加载静态资源

    <!--静态资源路径-->
    {% static %}
    {% load static %}
    <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
    <!--引用JS文件时使用:-->
    {% load static %}
    <script src="{% static "mytest.js" %}"></script>
    <!--某个文件多处被用到可以存为一个变量-->
    {% load static %}
    {% static "images/hi.jpg" as myphoto %}
    <img src="{{ myphoto }}"></img> <!--动态获取静态资源路径-->
    {% get_static_prefix %}
    {% load static %}
    <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
    <!--或者-->
    {% load static %}
    {% get_static_prefix as STATIC_PREFIX %}
    <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
    <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
  3. csrfr_token标签

    {% csrf_token %}

    用于生成csrf_token的标签,用于防治跨站攻击验证

    如果view的index里用的是render_to_response方法,则不会生效

    其实质是生成一个input标签,然后与其他标签一起提交给后台

  4. verbatin语句

    阻止模板语言的渲染

    <!--禁止render,原样渲染-->
    {% verbatim %}
    {{ hello }}
    {% endverbatim %}
  5. 自定义filter和simply_tag

    自定义filter

    1. 首先在某个app中,创建一个python包,叫做templatetags,注意,这个包的名字必须为templatetags,不然就找不到。

    2. 在这个templatetags包下面,创建一个python文件用来存储过滤器。

    3. 在新建的python文件中,定义过滤器(也就是函数),这个函数的第一个参数永远是被过滤的那个值,并且如果在使用过滤器的时候传递参数,那么还可以定义另外一个参数。但是过滤器最多只能有2个参数。

    4. 在写完过滤器(函数)后,要使用django.template.Library.filter进行注册。

      from Django import template
      register= template.Library()
      defgreet(value,word):
      return value + word
      register.filter(“greet“(注册名称),greet)
    5. 还要把这个过滤器所在的这个app添加到settings.INSTALLED_AAPS中(如果创建应用时已经添加过,就省略这一步)

    6. 在模板中使用load标签加载过滤器所在的python包。

    7. {% load [自定义过滤器的文件名] %}

    自定义simply_tag

    1. 在APP下面创建一个包。比如:template_tag并在包内创建比如:xx.py文件。

      from django import template
      register = template.Library() @register.simple_tag
      def my_simple_time(v1):
      return v1*1000
    2. 在setting中修改。INSTALLAPP加上创建的包名。

    3. 在html里加一句{%load template_tag%}在合适的位置使用标签{{ my_simple_time 参数 }}

2.3 变量的过滤器(filter)的使用

格式

{{ obj | filter : param}}

参数

  • add过滤器:

    • value与参数相加,若不能转换成int,则返回空
  • cut过滤器:
    • 移除value中所有指定的字符串。类似于python中的replace()
  • date过滤器:
    • date将一个日期按照指定的格式,格式化成字符串。
    • Y:四位数字年份;m:两位数字月份;n:月份;d:两位数字的天;j:天;g:12小时制的小时;G:24小时制的小时;h:12小时制两位数的小时;H:24小时制两位数的小时;i:分钟;s:秒
  • default过滤器:
    • 如果value为False([],"",None,{},()),则返回参数
  • default_if_none过滤器:
    • 如果value为None,则返回参数
  • first和last过滤器:
    • first返回列表/元组/字符串中的第一个元素。
    • last返回列表/元组/字符串中的最后一个元素。
  • floatformat过滤器:
    • floatformat使用四舍五入的方式返回一个浮点类型;参数为X,则保留X位小数。
  • join过滤器:
    • 类似与Python中的join,将列表/元组/字符串用指定的字符进行拼接。
  • length过滤器:
    • 获取一个列表/元组/字符串/字典的长度。
  • lower和upper过滤器:
    • lower将value中所有的字符全部转换成小写。
    • upper将value中所有的字符全部转换成大写。
  • random过滤器:
    • 从value中随机选择一个值。
  • safe过滤器:
    • 关闭字符串的自动转义,如果value是一串html代码,那么将会把这个html代码渲染到浏览器中。
  • slice过滤器:
    • 类似于python中的切片。
  • striptags过滤器:
    • 删除字符串中所有的html标签。
  • truncatechars过滤器:
    • 参数限制了value的长度,最后一个参数以...作为省略号。
  • truncatechars_html过滤器
    • 与truncatechars类似,但不会去掉html标签

02.Django-模板的更多相关文章

  1. Django模板语言相关内容

    Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 ...

  2. Django—模板

    索引 一.模板语言 1.1 变量 1.2 标签 1.3 过滤器 1.4 自定义过滤器 1.5 注释 二.模板继承 三.HTML转义 四.CSRF 五.验证码 六.反向解析 模板 作为Web框架,Dja ...

  3. Django模板语言初识

    一.Django框架简介 1.MVC框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...

  4. Django模板语言(常用语法规则)

    Django模板语言 The Django template language 模板中常用的语法规则 {最新版本的Django语法可能有改变,不支持的操作可能支持了.[HTML教程 - 基本元素/标签 ...

  5. Django 模板语言 标签

    前言:django的模板语法基本和flask的jinja2基本一样.下面比较一下两个模板语法的区别. ------深度变量的查找(万能的句点号) 在 Django 模板中遍历复杂数据结构的关键是句点字 ...

  6. Django模板语言,过滤器整理

    Django模板语言,过滤器整理 1. add {{ value|add:"2" }} 把add后的参数加给value: 处理时,过滤器首先会强制把两个值转换成Int类型. 如果强 ...

  7. Django模板常用语法规则

    Django 模板标签 if/else 标签 for 标签 ifequal/ifnotequal 标签 注释标签 过滤器 include 标签 URL标签 模板继承   if/else 标签 1. 基 ...

  8. Django模板语言, 过滤器整理

    Django模板语言,过滤器整理 1. add {{ value|add:"2" }} 把add后的参数加给value: 处理时,过滤器首先会强制把两个值转换成Int类型. 如果强 ...

  9. Django框架02 /Django下载安装、url路由分发

    Django框架02 /Django下载安装.url路由分发 目录 Django框架02 /Django下载安装.url路由分发 1. django下载安装 2. pycharm创建项目 3. 基于D ...

  10. Django模板与Vue.js冲突问题

    参考: https://my.oschina.net/soarwilldo/blog/755984 方法1:修改vue.js的默认的绑定符号 Vue.config.delimiters = [&quo ...

随机推荐

  1. Jaba_Web--JDBC 修改记录操作模板

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  2. ACM模板合集

    写在前面: 第一年小白拿铜牌,第二年队友出走,加上疫情原因不能回校训练导致心底防线彻底崩盘,于是选择退役. 自从退役之后,一直想我打了那么久的ACM,什么也没留下觉得很难受,突然想到我打ACM的时候, ...

  3. RF(自定义关键字)

    1.在 D:\work_software\python\Lib\site-packages 文件夹下, 新建 python package 包 ,例如我的是 TestLibrary 建好后的完整路径: ...

  4. 大batch任务对structured streaming任务影响

    信念,你拿它没办法,但是没有它你什么也做不成.—— 撒姆尔巴特勒 前言 对于spark streaming而言,大的batch任务会导致后续batch任务积压,对于structured streami ...

  5. 02_Java语法

    1.注释 2.关键字 3.标识符 4.常量 5.变量 6.数据类型 7.数据类型转换 8.表达式 9.运算符 9.1算数运算符 9.2赋值运算符 9.3比较运算符 9.4逻辑运算符 9.5三元运算符 ...

  6. Matlab2016b线性规划函数linprog的几个问题

    一.如何设置算法为单纯型法: options = optimoptions('linprog','Algorithm','dual-simplex') 二.linprog的参数用法: [x,Fval, ...

  7. Blazor入门:ASP.NET Core Razor 组件

    目录 关于组件 组件类 静态资产 路由与路由参数 组件参数 请勿创建会写入其自己的组参数属性的组件 子内容 属性展开 任意参数 捕获对组件的引用 在外部调用组件方法以更新状态 使用 @ 键控制是否保留 ...

  8. fork...join的用法

    如果希望在仿真的某一时刻同时启动多个任务,可以使用fork....join语句.例如,在仿真开始的 100 ns 后,希望同时启动发送和接收任务,而不是发送完毕后再进行接收,如下所示: initial ...

  9. [hdu5396 Expression]区间DP

    题意:给一个表达式,求所有的计算顺序产生的结果总和 思路:比较明显的区间dp,令dp[l][r]为闭区间[l,r]的所有可能的结果和,考虑最后一个符号的位置k,k必须在l,r之间,则l≤k<r, ...

  10. 黑马程序员_毕向东_Java基础视频教程——转义字符(随笔)

    转义字符 转义字符 通过 \ 来转变后面的字母或符号的含义 \n :换行 \b :退格.相当于 backspace \r : 相当于回车键. Windows系统中,回车是由两个字符来表示 \r \n. ...