Django模板系统
这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战
Django模板基本语法
Django模板系统主要涉及模板变量、过滤器、模板标签等。
-
模板变量形如{{ name}},{{}}内为一个变量名
-
过滤器主要是对模板变量进行处理,如改变显示方式
-
模板标签形如{% name%},{%%}内是一个与逻辑相关的名字
模板文件
Django中的模板文件是HTML文件
常规情况下我们会在项目根目录(即manage.py文件所在目录)下建立一个名为templates的文件夹,用来存放我们的模板文件。
在settings.py文件的TEMPLATES代码块中设置模板文件所在路径,DIRS就是设置模板文件路径的地方
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 定义一个目录列表,模板引擎按顺序在其中查找模板文件
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# APPS_DIRS为True就查找,False就不查找
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
模板变量
模板变量的格式为{{ name }},其中name表示变量名,name两侧都要有一个空格,变量名可以由字母、数字以及下划线组成,不能包含空格或标点符号。
模板变量内嵌在HTML文件中,当Django模版引擎检测到一个模板变量时,它会用变量代表的实际值或内容进行替换。
在模板变量中,有变量名后加点“.”再加字符串的形式,Django模版引擎会根据变量的不同情况进行解析。如果是字典变量则按字典形式查询key值;如果是类对象变量则按属性或方法查询;如果是列表变量则按索引数字查询。
例子:
视图
def test(request):
a='测试'
b={'n':'测试字典'}
return render(request,'test.html',{'a':a,'b':b})
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ a }}</h1>
<h1>{{ b.n }}</h1>
</body>
</html>
模板注释
模板语言中也可以使用注释,如{# ××× #}
单行注释形式如下。
{# 这里写注释 #}
多行注释要使用注释标签。
{% comment %}
........
{% endcomment %}
过滤器
通过过滤器对模板变量进行再“加工”改变模板变量的形式或内容
{{ name|filter_name:参数 }}
管道符“|”右边就是过滤器名字
过滤器可以传递参数,过滤器名字与参数用“:”分隔
在过滤器格式中,管道符“|”前面的变量与“:”后面的参数都将作为参数传给过滤器处理
内置过滤器
常用过滤器
-
过滤器default,格式为{{ name|default:"默认值"}},如果模板变量的值为空或False,就显示默认值。
-
过滤器length,格式为{{ name|length }},显示模板变量的长度。
-
过滤器truncatechars,格式为{{ name|truncatechars:6 }},适用于模板变量是字符串的情况,显示指定的字符个数,后面以省略号“...”结尾,“...”算为3个字符。例如传入的参数为6个字符时,从字符串中截取3个字符,后面加“...”。
-
过滤器upper和lower,{{ name |upper }}将字符串转换为全部大写的形式;{{ name|lower }}将字符串转换为全部小写的形式。
-
过滤器slice,格式为{{ name|slice:":2"}},用于模板变量是列表或字符串的情况,显示其中的一部分,也就是切片,与Python切片的语法相同。
-
过滤器date,格式为{{ name|date:"Y-m-d H:i:s"}},用于模板变量是日期或时间的情况,提供格式化输出。
-
过滤器safe,格式为{{ name|safe }},为了安全,Django的模板会对HTML标签和Java Script代码等语法标签进行自动转义(转成纯文本字符串),过 滤器safe则会关闭自动转义功能
例子:
视图
def test(request):
a='测试'
b='<h1>123<h1>'
c='abcABC'
time=datetime.datetime.now()
return render(request,'test.html',{'a':a,'b':b,'c':c,'time':time})
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<H1>{{ c|length }}</H1>
<H1>{{ c|truncatechars:2 }}</H1>
<H1>{{ c|upper }}</H1>
<H1>{{ c|lower }}</H1>
<H1>{{ c|slice:"2:5" }}</H1>
<H1>{{ c|date:"Y-m-d H:i:s" }}</H1>
<H1>{{ b }}</H1>
<H1>{{ b|safe}}</H1>
</body>
</html>
模板标签
内置模板标签
模板标签if
用于判断,虽然它放在HTML文件中,但其语法与Python代码语法非常相似。{% if %}为真,模板系统就显示{% if %}和{% endif %}之间的内容。模板标签if可以包含{% else %}、{% elif %}子句。
{% if a>0 %}
a>0
{% elif a<0 %}
a<0
{% else %}
a=0
{% endif %}
模板标签ifequal和ifnotequal
一个用于判断两个值是否相等,一个用于判断两个值是否不相等。
{% ifequal a 0 %}
a=0
{% endifequal %}
{% ifnotequal a 0 %}
a!=0
{% endifnotequal %}
for循环模板标签
与Python代码语法相似,{% for %}用于循环可迭代变量,每次循环时显示{% for %}和{% endfor %}之间的内容。
{% empty %}
#判断列表是否为空
设有一个列表变量lists
lists=[{'naem':1},{'naem':2},{'naem':3},{'naem':4},]
使用for循环模板标签遍历lists列表
{% for user in lists%}
{{ user.name}}
{% empty %} #判断列表是否为空
无数据
{% endfor %}
for循环标签的内置参数
●forloop.counter:从1开始返回当前循环的索引值。
●forloop.counter0:从0开始返回当前循环的索引值。
●forloop.revcounter:返回当前循环的倒序索引值,从最大索引值起始,最后到值1。●forloop.revcounter0:返回当前循环的倒序索引值,从最大索引值起始,最后到值0。
●forloop.first:返回布尔值,表示当前循环是不是第一次循环。
●forloop.last:返回布尔值,表示当前循环是不是最后一次循环。
●forloop.parentloop:本层循环的外层循环(父循环)。
例子:
{% for user in lists%}
第{{ forloop.counter }}个name是:
{{ user.name}}
{% empty %} #判断列表是否为空
无数据
{% endfor %}
转载自:https://juejin.cn/post/7028808604966715422