Django框架入门三模板语言的过滤器,if/else标签,for标签,ifequal标签,include标签,csrf_token标签,模板继承
文章目录1. 搭建环境1.1 启动服务2. 过滤器1. 搭建环境目录结构,根据上节创建一致,新建TmplUseTag.html模板文件在 settings.py中指定模板位置在 views.py中创建视图函数#!/usr/bin/env python# -*- coding: utf-8 -*-"""@author: JinWenChao@file: views@time: 2020/11/30
文章目录
1. 搭建环境
目录结构,根据上节创建一致,新建TmplUseTag.html
模板文件
在 settings.py
中指定模板位置
在 views.py
中创建视图函数
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: JinWenChao
@file: views
@time: 2020/11/30 16:12
"""
from django.shortcuts import render
def TmplUseTag(request):
# 用户列表取值的数组
arr_list = ['孙悟空', '猪八戒', '沙和尚', '唐三藏']
# 字典取值
author = {"name": "吴承恩"}
return render(request, 'TmplUseTag.html', {"arr_list": arr_list, "author": author})
在 urls.py
中绑定视图和URL
from django.urls import path
from . import views
# 此项就是django的url配置
urlpatterns = [
# 添加路由TmplUseTag,并绑定视图为views.TmplUseTag,视图中转发到TmplUseTag.html中渲染
path('TmplUseTag', views.TmplUseTag),
]
创建 TmplUseTag.html
模板文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板标签演示</title>
</head>
<body>
<h1>列表取值</h1>
<p>取出整个列表: {{ arr_list }}</p>
<p>取出列表中第一个元素: {{ arr_list.0 }}</p>
</body>
<h1>字典取值</h1>
<p>作者: {{ author.name }}</p>
</html>
1.1 启动服务
浏览器输入 http://127.0.0.1:8080/TmplUseTag
查看环境是否正确,如下所示为正常
2. 过滤器
模板语法 : {{ 变量名 | 过滤器:可选参数 }}
lower
: 转换为小写first | upper
: 第一个元素大写content| slice:"5"
: 显示变量 content 的前5个词addslashes
: 添加反斜杠到任何反斜杠、单引号或者双引号前面date
: 按指定的格式字符串参数格式化 date 或者 datetime 对象,实例:{{ pub_date|date:"F j, Y" }}
length
: 返回变量的长度default
: 为变量提供一个默认值,如果值为0 0.0 False 0j "" [] () set() {} None
这些 ,则使用指定默认值filesizeformat
: 以更易读的方式显示文件的大小(即’13 KB’, ‘4.1 MB’, '102 bytes’等)truncatechars
: 如果字符串包含的字符总个数多于指定的字符数量,那么会被截断掉后面的部分truncatechars_html
: 类似于 truncatechars ,只不过是不会切割 html 标签safe
: 将字符串标记为安全,不需要转义,传标签字符串到页面就是a标签stringtags
: 删除字符串中所有的 html 标签,与safe相反add
: 在传过来的参数基础上添加值,这个过滤器会尝试将值和参数转换成整形然后进行相加,如果转换成整形过程中失败了,那么会将 值 和 参数 进行拼接,如果是字符串,那么会拼接成字符串,如果是列表,那么会拼接成一个列表cut
: 移除值中所有指定的字符串,类似于 python 中的replace(args,"")
join
: 类似与 Python 中的 join,将列表/元组/字符串用指定的字符进行拼接random
: 在被给的列表/字符串/元组中随机的选择一个值
2.1 date日期格式化表
格式字符 | 描述 | 示例 |
---|---|---|
Y-m-d f:s | 常用格式化 | 2020-12-01 11:08:43 |
Y | 年,四位数字 | 2020 |
m | 月份,两位数字 | 12-01 |
n | 月份,不带0前缀 | 12-1 |
d | 天.两位数字表示 | 12-01 |
j | 天,不带0前缀 | 2020 |
g | 小时,前缀不带0的,12小时制 | 5:15 |
h | 小时,前缀带0,12小时制 | 05:15 |
G | 小时,前缀不带0的,24小时制 | 5:15 |
H | 小时,前缀带0,24小时制 | 05:15 |
i | 分钟,前缀带0 | 17:05 |
s | 秒,前缀带0 | 17:05 |
f | 小时+分钟,前缀带0 | 11:09 |
更多的过滤器用法就不过多介绍了
2.2 过滤器案例演示
在views.py
中,添加如下内容
def TmplUseTag(request):
# 用户列表取值的数组
arr_list = ['孙悟空', '猪八戒', '沙和尚', '唐三藏']
# 字典取值
author = {"name": "吴承恩"}
# 过滤器值
author_english = {'name': 'wuChengEn'}
name_list = ['Marry', 'Jack', '\lucy']
now_time = datetime.datetime.now()
# 如果值为 0 0.0 False 0j "" [] () set() {} None 这些 ,则使用指定默认值
default_name = ''
filesizeformat = 2048
# safe 不需要转义值
safe = "<a href='https://www.baidu.com/'>点击跳转</a>"
return render(request, 'TmplUseTag.html', {"arr_list": arr_list,
"author": author,
"author_english": author_english,
"name_list": name_list,
"now_time": now_time,
"default_name": default_name,
"filesizeformat": filesizeformat,
"safe": safe,
}
)
在 urls.py
中添加如下内容
# 此项就是django的url配置
urlpatterns = [
# 添加路由TmplUseTag,并绑定视图为views.TmplUseTag,视图中转发到TmplUseTag.html中渲染
path('TmplUseTag', views.TmplUseTag),
]
在 TmplUseTag.html
中添加如下内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板标签演示</title>
</head>
<body>
<h1>列表取值</h1>
<p>取出整个列表: {{ arr_list }}</p>
<p>取出列表中第一个元素: {{ arr_list.0 }}</p>
</body>
<h1>字典取值</h1>
<p>作者: {{ author.name }}</p>
<h1>过滤器语法</h1>
<p>lower 将 wuChengEn 转成小写: {{ author_english.name|lower }}</p>
<p>first | upper 将 Marry 转为全部大写: {{ name_list|first|upper }}</p>
<p>slice 显示 wuChengEn 前5个字符 : {{ author_english.name|slice:"5"}}</p>
<p>addslashes 添加反斜杠到 \lucy 前面 : {{ name_list|last|addslashes }}</p>
<p>date 格式化现在的日期 : {{ now_time|date:"Y-m-d f:s" }}</p>
<p>length 返回 wuChengEn 的长度 : {{ author_english.name|length }}</p>
<p>default 为变量提供一个默认值 : {{ default_name|default:"作家:吴承恩" }}</p>
<p>filesizeformat 以更易读的方式显示文件的大小 2048 : {{ filesizeformat| filesizeformat }}</p>
<p>truncatechars 显示 wuChengEn 的7个字符,多余的以省略号表达 : {{ author_english.name| truncatechars:7 }}</p>
<p>safe 不需要转义 : {{ safe| safe }}</p>
<p>add 在传过来的参数 2048 基础上添加值 2 因为是int类型 所以相加: {{ filesizeformat| add:"2" }}</p>
<p>cut 移除值中所有指定的字符串: {{ name_list.0| cut:"r" }}</p>
<p>join 将 name_list 中的三个名字使用 + 拼接 : {{ name_list| join:"+" }}</p>
<p>random 在 name_list 中的三个名字中随机选择一个值 : {{ name_list| random }}</p>
<p>striptags 删除a链接字符串中所有的 html 标签 : {{ safe| striptags }}</p>
<p>truncatechars_html 显示a链接字符串中前两个字符,不会切割html标签 : {{ safe| truncatechars_html:"2" }}</p>
</html>
启动服务,在浏览器地址栏输入 : http://localhost:8080/TmplUseTag
,可看到过滤器语法案例演示
3. 标签
3.1 if/else 标签
在 views.py
中修改内容如下
def TmplUseTag(request):
arr_list = ['孙悟空', '猪八戒', '沙和尚', '唐三藏']
return render(request, 'TmplUseTag.html', {"arr_list": arr_list})
在 TmplUseTag.html
中修改内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板标签演示</title>
</head>
<body>
<h1>if/else演示</h1>
{% if arr_list.0 == '孙悟空' %}
三打白骨精
{% elif arr_list.0 == '猪八戒' %}
梦回高老庄
{% else %}
取经路上多坎坷
{% endif %}
</body>
</html>
结果展示
3.2 for 标签
3.2.1 正向迭代
views.py中内容不变,更改TmplUseTag.html
中内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板标签演示</title>
</head>
<body>
<h1>for标签演示</h1>
{% for arr in arr_list %}
<p>{{ arr }}</p>
{% endfor %}
</body>
</html>
结果展示
3.2.2 反向迭代
在循环后面加上 reversed 为倒序循环
{% for arr in arr_list reversed %}
<p>{{ arr }}</p>
{% endfor %}
结果展示
3.2.3 遍历字典
在 views.py
中修改为如下内容
def TmplUseTag(request):
dict_list = {'name': '吴承恩', 'job': 'author', 'book': '西游记'}
return render(request, 'TmplUseTag.html', {"dict_list": dict_list})
修改 TmplUseTag.html
body中内容为如下
<h1>遍历字典</h1>
{% for key,value in dict_list.items %}
{{ key }} : {{ value }} <br>
{% endfor %}
结果展示
3.2.4 empty 标签
如果列表为空的话,那么会执行 empty 标签中的语句
在 views.py
中修改如下内容
def TmplUseTag(request):
arr_list = []
return render(request, 'TmplUseTag.html', {"arr_list": arr_list})
修改 TmplUseTag.html
body中内容为如下
<h1>empty</h1>
{% for i in arr_list %}
{{ forloop.counter0 }}
{% empty %}
列表是空的奥!
{% endfor %}
结果展示
3.2.5 forloop
在 {% for %} 标签里可以通过 {{forloop}} 变量获取循环序号
- forloop.counter: 顺序获取循环序号,从 1 开始计算
- forloop.counter0: 顺序获取循环序号,从 0 开始计算
- forloop.revcounter: 倒叙获取循环序号,结尾序号为 1
- forloop.revcounter0: 倒叙获取循环序号,结尾序号为 0
- forloop.first(一般配合if标签使用): 第一条数据返回 True,其他数据返回 False
- forloop.last(一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False
在 views.py
中添加如下代码
def TmplUseTag(request):
arr_list = ['孙悟空', '猪八戒', '沙和尚', '唐三藏']
return render(request, 'TmplUseTag.html', {"arr_list": arr_list})
修改 TmplUseTag.html
body中内容为如下
<h1>forloop 注意演示时注释其他只留一个测试,不然会乱</h1>
{% for i in arr_list %}
{{ forloop.counter }}
{# {{ forloop.counter0 }}#}
{# {{ forloop.revcounter }}#}
{# {{ forloop.revcounter0 }}#}
{# {{ forloop.first }}#}
{# {{ forloop.last }}#}
{% endfor %}
结果展示
3.2.6 嵌套循环
修改 views.py
内容如下
def TmplUseTag(request):
arr_list = ['孙悟空', '猪八戒', '沙和尚', '唐三藏']
views_list = [{'name': '演员表'}]
return render(request, 'TmplUseTag.html', {"arr_list": arr_list,
"views_list": views_list})
修改 TmplUseTag.html
body内容如下
<h1>嵌套循环</h1>
{% for v in views_list %}
<h1>{{ v.name }}</h1>
<ul>
{% for arr in arr_list %}
<li>{{ arr }}</li>
{% endfor %}
</ul>
{% endfor %}
结果展示
3.3 ifequal/ifnotequal 标签
修改 views.py
内容如下
def TmplUseTag(request):
value = 15
return render(request, 'TmplUseTag.html', {"value": value})
修改 TmplUseTag.html
body内容如下
<h1>ifequal/ifnotequal 标签</h1>
{% ifequal 15 value %}
<p>值相等</p>
{% else %}
<p>值并不相等</p>
{% endifequal %}
结果展示
3.4 include 标签
在 templates
文件夹下创建页面 in_helloWorld.html
并添加内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>被引入的html页面</title>
</head>
<body>
<h1>我是 in_helloWorld.html 页面</h1>
</body>
</html>
修改 TmplUseTag.html
body内容如下
<h1>include 标签</h1>
{% include "in_helloWorld.html"%}
结果展示
3.5 csrf_token 标签
{% csrf_token %}
- csrf_token 用于form表单中,作用是跨站请求伪造保护。
- 如果不用{
% csrf_token %}
标签,在用 form 表单时,要再次跳转页面会报403权限错误 - 用了
{% csrf_token %}
标签,在 form 表单提交数据时,才会成功
解析:
首先,向浏览器发送请求,获取登录页面,此时中间件 csrf 会自动生成一个隐藏input标签,该标签里的 value 属性的值是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签
然后,等用户需要用到form表单提交数据的时候,会携带这个 input 标签一起提交给中间件 csrf,原因是 form 表单提交数据时,会包括所有的 input 标签,中间件 csrf 接收到数据时,会判断,这个随机字符串是不是第一次它发给用户的那个,如果是,则数据提交成功,如果不是,则返回403权限错误
4.模板继承
- 模板可以用继承的方式来实现复用,减少冗余内容
- 网页的头部和尾部内容一般都是一致的,我们就可以通过模板继承来实现复用
- 父模板用于放置可重复利用的内容,子模板继承父模板的内容,并放置自己的内容
创建 fu.html
并添加如下内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父模板</title>
</head>
<body>
<h1>这里是父模板</h1>
{% block content %}
这里是预留给子模板填写内容的位置
{% endblock %}
</body>
</html>
创建 zi.html
并添加如下内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>子模板</title>
</head>
<body>
{% extends "fu.html"%}
{% block content %}
我是子模板,我重写了父模板给我预留的位置
{% endblock %}
</body>
</html>
修改 views.py
内容如下
def TmplUseTag(request):
return render(request, 'zi.html')
结果展示
借鉴 https://www.runoob.com/django/django-template.html
更多推荐
所有评论(0)