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分钟,前缀带017:05
s秒,前缀带017:05
f小时+分钟,前缀带011: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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部