Django框架入门三模板语言的过滤器,if/else标签,for标签,ifequal标签,include标签,csrf_token标签,模板继承
文章目录
- 1. 搭建环境
- 1.1 启动服务
- 2. 过滤器
- 2.1 date日期格式化表
- 2.2 过滤器案例演示
- 3. 标签
- 3.1 if/else 标签
- 3.2 for 标签
- 3.2.1 正向迭代
- 3.2.2 反向迭代
- 3.2.3 遍历字典
- 3.2.4 empty 标签
- 3.2.5 forloop
- 3.2.6 嵌套循环
- 3.3 ifequal/ifnotequal 标签
- 3.4 include 标签
- 3.5 csrf_token 标签
- 4.模板继承
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 renderdef 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模板文件
<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 = "点击跳转"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中添加如下内容
<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 = 15return 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并添加内容
<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并添加如下内容
<html lang="en">
<head><meta charset="UTF-8"><title>父模板title>
head>
<body>
<h1>这里是父模板h1>{% block content %}这里是预留给子模板填写内容的位置
{% endblock %}
body>
html>
创建 zi.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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
