02.Django-模板

模板

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标签

猜你喜欢

转载自www.cnblogs.com/yanadoude/p/12980406.html