模板语法传值
两种方式:
-
{{}}:变量相关
-
{%%}:逻辑相关
模板语法传值支持python的所有基本数据类型
内部能够自动判断当前的变量名是否可以 加括号调用,如果可以就会自动执行,针对函数名和类名
模板语法之注释
{# 注释内容 #}
模板语法之过滤器
过滤器类似于内置函数,但是这种内置函数最多只能额外传输一个参数。
语法结构:
{{ 数据对象|过滤器名称:参数 }}
常见的Django过滤器
#1、default
#作用:如果一个变量值是False或者为空,使用default后指定的默认值,否则,使用变量本身的值,如果value=’‘则输出“nothing”
{{ value|default:"nothing" }}
#2、length
#作用:返回值的长度。它对字符串、列表、字典等容器类型都起作用,如果value是 ['a', 'b', 'c', 'd'],那么输出是4
{{ value|length }}
#3、filesizeformat
#作用:将值的格式化为一个"人类可读的"文件尺寸(如13KB、4.1 MB、102bytes等等),如果 value 是 12312312321,输出将会是 11.5 GB
{{ value|filesizeformat }}
#4、date
#作用:将日期按照指定的格式输出,如果value=datetime.datetime.now(),按照格式Y-m-d则输出2019-02-02
{{ value|date:"Y-m-d" }}
#5、slice
#作用:对输出的字符串进行切片操作,顾头不顾尾,如果value=“egon“,则输出"eg"
{{ value|slice:"0:2" }}
#6、truncatechars
#作用:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾,如果value=”hello world egon 嘎嘎“,则输出"hello...",注意8个字符也包含末尾的3个点
{{ value|truncatechars:8 }}
#7、truncatewords
#作用:同truncatechars,但truncatewords是按照单词截断,注意末尾的3个点不算作单词,如果value=”hello world egon 嘎嘎“,则输出"hello world ..."
{{ value|truncatewords:2 }}
#8、safe
#作用:出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,例如value="<script>alert(123)</script>",模板变量{{ value }}会被渲染成<script>alert(123)</script>
交给浏览器后会被解析成普通字符”<script>alert(123)</script>“,失去了js代码的语法意义,
但如果我们就想让模板变量{{ value }}被渲染的结果又语法意义,那么就用到了过滤器safe,比如value='<a href="https://www.baidu.com">点我啊</a>',
在被safe过滤器处理后就成为了真正的超链接,不加safe过滤器则会当做普通字符显示’<a href="https://www.baidu.com">点我啊</a>‘
{{ value|safe }}
针对safe过滤器,我们也可以在后端实现:使用mark_safe方法后将结果传给页面,页面就能识别标签语法了。
from django.utils.safestring import mark_safe
tag = '<h1">内容</h1>'
res = mark_safe(ttt)
模板语法之标签
语法结构:
{{ 标签名称… }}
内容
{{ end标签名称 }}
if判断
{% if 条件1 %}
内容
{% elif 条件2 %}
内容
{% else %}
内容
{% endif %}
for循环
{% for 变量 in 容器类型 %}
内容
{% empty %} # 可不写
for循环对象为空时执行
{% endfor %}
自定义过滤器,标签和inclusion_tag
一. 自定义过滤器
当内置的过滤器或标签无法满足我们需求时,我们可以自定义,具体操作步骤如下
-
在settings中的INSTALLED_APPS添加当前app的名字,不然django无法找到自定义的过滤器或标签
-
在文件夹app01中创建子文件夹templatetags(文件夹名只能是templatetags)
-
在templatetags新建任意.py文件,
-
新建的py文件内需要先提前编写两行固定的代码
from django import template
register = template.Library()
- 使用时需要先使用模板语法导入py文件名
{% load py文件名 %}
- 自定义过滤器或标签必须重新启动django方可生效
自定义的过滤器只能定义最多两个参数
#1、自定义过滤器
@register.filter
def my_multi_filter(v1 ,v2): # 自定义的过滤器只能定义最多两个参数,针对{{ value1 | filter_multi:value2 }},参数传递为v1=value1,v2=value2
return v1 * v2
使用:必须先加载存有自定义过滤器和标签的文件
#
{% load my_tags %}
{{ salary|my_multi_filter:12 }}
自定义的标签可以定义多个参数
#2、自定义标签
@register.simple_tag
def my_multi_tag(v1, v2): # 自定义的标签可以定义多个参数
return v1 * v2
使用:
{% my_multi_tag 1 2 %}
inclusion_tag
inclusion_tag可以把写好的一些标签放入到网页中。
该方法需要先作用于一个局部html页面,之后将渲染的结果放到调用的位置。
@register.inclusion_tag('content.html')
def func(n):
l1 = [i for i in range(n)]
return l1
content.html
<ul>
{% for i in l %}
<li>{{ i }}</li>
{% endfor %}
</ul>
页面调用:
{% func 10 %}
模板的导入
在实际开发中,模板文件彼此之间可能会有大量冗余代码,为此django提供了专门的语法来解决这个问题,主要围绕三种标签的使用:include标签、extends标签、block标签
比如我想要让home.html与index.html一样,那么我只需要将index.html导入到home.html中即可。
home.html
{% include ‘index.html’ %}
模板的继承
类似于面向对象中的继承:继承了某个页面就可以使用该页面上所有的资源
有很多差不多的页面 知识局部发生了变化 模板的继承可以很好的实现该需求
1.先在模板中通过block划定将来可以被修改的区域
{% block content %}
<h1></h1>
<p></p>
{% endblock %}
2.子模板继承模板
{% entends ‘index.html’ %}
3.修改划定的区域
{% block centent %}
<h1></h1>
<p></p>
{%endblock%}
4.子页面还可以重复使用父页面的内容
{{block.super}}