模板语法
模板语法传值
django提供的模板语法只有两个符号:
- {{ }}:主要用于变量相关操作(引用)
- {% %}:主要用于逻辑相关操作(循环、判断)
传值方式
传值方式一:使用render()方法传值(适用于数据量较少的情况, 节省资源)
后端传值:
def index(request):
return render(request, 'index.html', {'name': 'tom', 'age':18})
前端获取:
<h1>{{ name }}</h1>
<h1>{{ age }}</h1>
传值方式二:使用locals()方法传值,它会将当前名称空间中所有的名字全部传递给html页面(适用于数据量较多的情况,浪费资源)
后端传值:
def index(request):
name = 'tom'
age = 18
return render(request, 'index.html', locals())
前端获取:
<h1>{{ name }}</h1>
<h1>{{ age }}</h1>
传值范围
1.基本数据类型都可以。
2.函数名:模板语法会自动加括号执行并将函数的返回值展示到页面上,并且只会执行无参函数,如果是有参函数,模板语法会自动忽略。
3.文件名:直接显示文件IO对象。
4.类名:自动加括号实例化成对象,并显示对象的地址,同时具备调用属性和方法的能力。
5.对象名:直接显示对象的地址,并且具备调用属性和方法的能力。
取值补充
django模板语法针对容器类型的取值,只有一种方式:句点符。
比如我传了一个容器类型数据:
data = {
'name': [
1, {'age':18}
]
}
前端获取age的值
{{ data.name.1.age }}
模板语法之过滤器
过滤器类似于内置函数,但是这种内置函数最多只能额外传输一个参数。
语法结构:
{{ 数据对象|过滤器名称:参数 }}
常见过滤器
过滤器 | 作用 |
---|---|
s|length | 计算数据s的长度 |
s|add:x | 将s与x相加 |
s|filesizeformat | 将数字s转成合适的文件计量单位(KB、MB..) |
s|deafult:'x' | 判断数据s的布尔值是否是False,是则返回x |
s|date:'x' | 将时间s格式化成x |
s|slice:'m:n' | 索引切片,相当于s[m,n] |
s|truncatewords:x | 按照空格截取x个文本,多出来的用省略号显示 |
s|truncatechars:x | 截取x个字符,多出来的用省略号显示 |
s|cut:'x' | 移除指定的字符x |
s|safe | 将s按照html格式转换 |
针对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 %}
其中{% empty %}可不写。
对于for循环,模板语法还提供了forloop关键字,是一个字典类型数据,里面存储了一些for循环的信息:{{ forloop }}
{
'parentloop': {},
'counter0': 0, # 从0计数,0代表for循环的第一次
'counter': 1, # 从1计数,1代表for循环的第一次
'revcounter': 4, # counter相反的结果
'revcounter0': 3, # counter0相反的结果
'first': True, # 是否是第一次循环
'last': False # 是否是最后一次循环
}
补充:针对字典同样提供了keys、values、items方法
自定义过滤器、标签、inclusion_tag
自定义过滤器、标签需知:
- 自定义过滤器、标签是在py文件中自定义的。
- 在应用下需要创建一个名为templatetags的文件夹,并在这个文件夹中创建py文件。
- py文件名称任意。
- 该py文件内需要先提前编写两行固定的代码
from django import template
register = template.Library()
- 使用时需要先使用模板语法导入py文件名
{% load py文件名 %}
自定义过滤器
自定义过滤器只能接收两个参数,第一个形参接收调用过滤器的数据,第二个形参接收自己填写的数据,比如自定义一个相减的过滤器
@register.filter
def reduce(a, b):
return a - b
使用:将s减5
{% load py文件名 %}
{{ s|reduce:5 }}
自定义简单标签
自定义简单标签可以接收任意的参数。
@register.simple_tag(name='func')
def f(a, b, c):
return a + b + c
使用:
{% load py文件名 %}
{% func 1 2 3 %}
对于自定义标签,需要设置name属性才能使用,并且使用时是用{%%}这个符号的。
自定义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 %}
模板语法之导入
类似于将html页面上的局部页面做成模块的形式,哪个地方想要直接导入即可展示。
比如我想要让home.html与index.html一样,那么我只需要将index.html导入到home.html中即可。
home.html
{% include 'index.html' %}
模板的继承
类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的资源,继承后我们就可以根据页面进行局部更改。
使用:
首先先在通过block划定将来可以被修改的区域:
{% block 区域名称 %}
标签内容
{% endblock %}
子页面继承:
{% extends '父页面' %}
子页面修改可以被修改的区域:
{% block 区域名称 %}
标签内容
{% endblock %}
子页面还可以重复使用父页面的内容:
{% block 区域名称 %}
{{ block.super }}
{{ block.super }}
...
{% endblock %}
补充:
一般来说,一个页面上最少应该有三个区域:css区域、内容区域、js区域,这样子页面就可以有自己独立的css、js、内容。
模板语法之注释
模板语法的注释
{# 注释内容 #}
HTML的注释可以在前端浏览器页面上直接查看到,模板语法的注释只能在后端查看,前端浏览器查看不了。