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

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐