语法
变量 {{ }}
逻辑{% %}
注释 {# #}
变量
当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。 变量的命名包括任何字母数字以及下划线 ("_")的组合。 变量名称中不能有空格或标点符号。
def get(self,request):
num = 1
name = "张三"
li = [1,2,3,4]
dic = {"1":"a","2":"b"}
class Cl():
count = "abc"
def foo(self):
print("foo")
# return render(request,"index.html",{"num":num,"name":name,"li":li,"dic":dic,"cl":cl})
return render(request,"index.html",locals())
<h1>{{ num }}</h1>
<h1>{{ name }}</h1>
<h1>{{ li }}</h1>
<h1>{{ dic.k1}}</h1>
<h1>{{ dic.keys }}</h1>
<h1>{{ dic.values }}</h1>
<h1>{{ dic.items }}</h1>
<h1>{{ Cl.count }}</h1>
<!--通过点可以进行字典查询、属性或方法查询、索引查询-->
过滤器
在Django的模板语言中,通过使用 过滤器 来改变变量的显示。
语法:
使用管道符"|"来应用过滤器。
{{ name|lower }}
注意事项:
- 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
- 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
- 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:’, ’ }}
- '|'左右没有空格没有空格没有空格
内置过滤器
标签 | 描述 |
---|---|
default | 设置默认值 |
length | 获取长度 |
filesizeformat | 转换值 |
slice | 切片 |
date | 格式化时间 |
safe | 转义html和js |
truncatechars | 截取字符串 |
truncatewords | 截取字符串 |
cut | 去除指定字符 |
join | 拼接字符串 |
timesince | 将日期格式设为自该日期起的时间 |
default
设置默认值如果变量是flase或为空时使用设置的默认值
<h1>{{ num|default:"默认值" }}</h1>
length
获取长度
<h1>{{ li|length }}</h1>
filesizeformat
将值转换为方便读取的格式
<h1>{{ size|filesizeformat }}</h1>
slice
切片
<h1>{{ name|slice:"1:3" }}</h1>
date
格式化时间
<h1>{{ date|date:"Y-m-d H:i:s" }}</h1>
safe
转义html和js
truncatechars
截取字符串,如果截取数小于原数长度则隐藏部分显示三个点,每个点占一个截取数
<h1>{{ name|truncatechars:6}}</h1>
<!--结果:abc...-->
truncatewords
在一定数量的字后截断字符串,截取的是多少个单词。
<h1>{{ name|truncatewords:2}}</h1>
<!--结果:ab cd ...-->
cut
对字符串去除指定字符
<h1>{{ name|cut:"a"}}</h1>
<!--结果:b cd ef ghi-->
join
按指定字符拼接
<h1>{{ li|join:"+" }}</h1>
<!--结果:1+2+3+4-->
timesince
将日期格式设为自该日期起的时间
{{ blog_date|timesince:comment_date }}
标签
标签比变量更加复杂:在输出中创建文本,通过循环或逻辑来控制流程,标签需要开始和结束标签 。
for标签
遍历每一个元素
<!--正序-->
{% for i in li %}
<span>{{ i }}</span>
{% endfor %}
<!--倒序-->
{% for i in li reversed %}
<span>{{ i }}</span>
{% endfor %}
<!--找不到或为空时执行empty-->
{% for i in li %}
<span>{{ i }}</span>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
循环序号
<!--
forloop.counter 当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环的对象,再通过上面的几个属性来显示外层循环的计数等
-->
{% for i in li %}
<span>{{ forloop.counter }} {{ i }}</span>
{% endfor %}
if 标签
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断,条件两边都有空格
{% if num > 100 or num < 0 %}
<p>1</p>
{% elif num > 80 and num < 100 %}
<p>2</p>
{% else %}
<p>3</p>
{% endif %}
with标签
使用一个简单地名字缓存一个复杂的变量,多用于给一个复杂的变量起别名
<!--方式1-->
{% with total=business.employees.count %}//等号两端无空格
{{ total }} <!--只能在with语句体内使用-->
{% endwith %}
<!--方式2-->
{% with business.employees.count as total %}
{{ total }}
{% endwith %}
自定义标签和过滤器
自定义过滤器
在应用下创建一个templatetags(固定名称)的文件夹,存放自定义的过滤器(过滤器是.py文件)
# 过滤器add
from django import template
register = template.Library() # register是固定名称
@register.filter
def add(a,b): # 最多接受两个参数,第一个参数接受|符前的数据,第二个参数接受|符后传递的数据
return a+b
<!--使用自定义过滤器-->
<!DOCTYPE html>
<html lang="en">
<!--导入过滤器文件-->
{% load glq %}
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ name|add:"123" }} <!--使用自定义过滤器,可以放在if for语句中-->
</body>
</html>
自定义标签
自定义标签的参数个数不限,使用前需要先引入自定义标签所在的py文件
# 自定义add.py
from django.utils.safestring import mark_safe
from django import template
register = template.Library()
@register.simple_tag
def add(a,b,c): # 参数个数不限
return a+b+c
@register.simple_tag
def view(a,b):
return mark_safe("<input type='text' id='%s' class='%s' />" %(a,b,))
<!DOCTYPE html>
{% load add %} <!--引入自定义标签,不需要加py后缀名-->
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% add name "123" "456" %} <!--使用自定义标签-->
{% view "123" "456" %}
</body>
</html>
inclusion_tag
多用于返回html代码片段,将一个页面里的内容用函数的返回值渲染,作为一个组件加载到调用这个函数的html文件中
# add.py文件
from django import template
register = template.Library()
@register.inclusion_tag("test.html") #
def add(a): # 可以传入多个参数
return {"data":a} # 返回数据
<!--test.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
传入数据{{ data }}
</body>
</html>
<!--index页面-->
<!DOCTYPE html>
{% load add %} <!--导入py文件-->
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% add "这是数据" %} <!--使用函数-->
</body>
</html>
组件
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方使用
<!--module.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>组件页面</h1>
</body>
</html>
<!--index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% include "module.html" %}
</body>
</html>
模板继承
Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。
<!--模板页面temp.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="c1">
这是一个模板
</div>
{% block m1 %} <!--预留钩子,其他使用该模板的页面可以替换内容-->
<h1>模板页面内容</h1>
{% endblock %} <!--结束-->
</body>
</html>
<!DOCTYPE html>
{% extends "temp.html" %} <!--导入模板-->
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% block m1 %} <!--定义和模板相同的钩子-->
{{ block.super }} <!--设置模板页面和子页面内容同时存在-->
<h1>index</h1> <!--子页面要替换的内容-->
{% endblock %} <!--结束-->
</body>
</html>