Django模板标签
Posted 礁之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django模板标签相关的知识,希望对你有一定的参考价值。
文章目录
此文章参考菜鸟教程:Django 模板 | 菜鸟教程 (runoob.com)
一、使用Django模板修改页面
-
上一章中,直接使用了
index_test.py
添加\\修改了资源页面,这次使用模板
来添加资源页面\\修改页面 -
先来看
index_test.py
文件,可以看到使用了模块django.http.HttpResponse()
来输出指定的信息:
#-*- coding: utf-8 -*-
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello World!!!")
-
而上面的这种方式会将数据和视图混合在一起,不符合Django中的MTC思想,所以我们可以使用模板来输出数据:
-
根据上一章节中的项目结构,现在在helloworld项目目录下创建
templates
目录,然后创建test.html
文件 -
现在的目录结构如下:
-
下面是test.html模板文件的内容:
<h1> hello </h1> #这里是变量,使用了双括号
- 下面向Django说明模板文件路径,修改helloworld容器目录下的
settings.py
文件:
import os #导入os模块
。。。。。。
TEMPLATES = [
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')], #修改DIRS,说明模板文件的路径,BASE_DIR是manage.py文件所在的路径
'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',
],
,
,
]
- 现在修改
index_test.py
和urls.py
,增加一个新的对象,用于向模板提交数据
render()方法参数:
render(request, template_name, context=None, content_type=None, status=None, using=None)
request
:必要参数,浏览器向服务器发送的请求对象,包含用户信息、请求内容、请求方式等template_name
:必要参数,设置模板文件名,用于生成网页内容context
:对模板上下文即模板变量赋值,以字典格式表示,默认情况下是一个空字典content_type
:响应内容的数据格式,一般情况下使用默认值即可status
:HTTP状态码,默认是200using
:设置模板引擎,用于解析模板文件、生成网页内容等
- index_test.py
#-*- coding: utf-8 -*-
from django.shortcuts import render
def hello(request):
contest =
contest['hello'] = 'Hello World!!!'
return render(request,'test.html',contest) #指定模板文件
- urls.py
#-*- coding: utf-8 -*-
from django.urls import path
from . import index_test
urlpatterns = [
path('hello/',index_test.hello),
]
-
可以看到,我们这里使用了
render
来代替之前使用的HttpResponse
,render
使用了一个字典contest
作为参数,contest
字典中元素的键值hello
对应了test.html模板文件中hello
变量 -
再次进行访问:
-
可以看到已经替换页面了,现在已经完成了使用模板来输出数据,实现数据与视图分离
二、Django模板标签
- 经过上面的实践,下面来看一下Django模板中常用的语法规则
- 变量
- 模板语法:
视图view:"HTML变量名":"views变量名"
HTML: 变量名
-
可以看到其实也就是字典,跟上面那个一样
-
下面来看案例:
- 现在修改视图文件
index_test.py
文件,下面是变量和字典的写法,可以看到思路其实是一样的:
- 变量 # -*- coding: utf-8 -*- from django.shortcuts import render def Hello(request): test_view = "测试" hello_view = "你好" return render(request,'test.html',"test":test_view,"hello":hello_view)
- 修改templates目录下的
test.html
文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> #页面名称 </head> <body> <p> test </p> #导入两个变量 <h1> hello </h1> </body> </html>
- 再次访问,成功修改!
- 现在修改视图文件
- 列表
-
templates中的test.html文件,可以使用
.
索引下标取出相对应的元素 -
下面来看案例:
- 修改视图文件
index_test.py
,相当于是把字典的值换成列表:
# -*- coding: utf-8 -*- from django.shortcuts import render def Hello(request): test_view = ["测试1号","测试2号","测试3号"] return render(request,'test.html',"test":test_view)
- 修改
test.html
文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <p> test </p> <p> test.0 </p> #配合 . 可以根据列表下标调用元素 <p> test.2 </p> </body> </html>
- 查看页面:
- 修改视图文件
- 字典
-
templates中的test.html文件,可以使用
.键
取出相对应的元素 -
下面来看案例:
- 修改视图文件
index_test.py
:
# -*- coding: utf-8 -*- from django.shortcuts import render def Hello(request): test_view = "name":"测试","age":22 return render(request,'test.html',"test":test_view)
- 修改
test.html
文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <p> test </p> <h1> test.name </h1> <h2> test.age </h2> </body> </html>
- 查看页面:
- 修改视图文件
- 过滤器
- 模板语法:
变量名 | 过滤器:可选参数
- 模板过滤器可以在变量被显示前修改它,过滤器使用管道字符:
name | lower #文档大写文本会转换成小写
- 过滤管道可以被
套接
,也就是说一个过滤器的输出可以作为下一个过滤器的输入,与linux的管道符是一样的
my_list | first | upper #取出第一个值并转换成大写
- 有些过滤器有参数,过滤器的参数跟随冒号
:
之后并且总是以双引号""
包含
bio | truncatewords:"30" #显示bio变量的前30个词
-
其他过滤器
addslashes
:添加反斜杠到任何反斜杠、单引号或者双引号前面date
:按照指定的格式字符串参数格式化date或者datetime对象
pub_date | date:"F J, Y"
length
:返回变量的长度
1、default
-
default
为变量提供一个默认值,如果视图传输的变量的布尔值是False,那么就会使用指定的默认值,以下的值的布尔值都是False
:0 0.0 False 0j "" [] () set() None
-
下面来看案例:
- 修改
index_test.py
视图文件:
# -*- coding: utf-8 -*- from django.shortcuts import render def Hello(request): test_view = "name":"zhangsan","time":0 return render(request,'test.html',"test":test_view)
- 修改
test.html
文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <p> test </p> <h1> test.time | default:"测试!!" </h1> #变量的布尔值为False则变量值为 测试!! </body> </html>
- 访问页面
- 修改
2、length
-
length
可以返回对象的长度,一般适用于字符串和列表,字典返回的是键值对的数量,集合返回的是去重后的长度 -
下面来看案例:
- 修改index_test.py视图文件
#-*- coding: utf-8 -*- from django.shortcuts import render def hello(request): test_view = "测试" return render(request,"test.html","test":test_view)
- 修改test.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <p> test | length </p> </body> </html>
- 访问页面
3、filesizeformat
-
filesizeformat会以更人性化的方式显示文件的大小,其实就是加上单位,如KB、MB等
-
字典返回的是键值对的数量,集合返回的是去重后的长度,下面来看案例:
- 修改index_test.py视图文件
#-*- coding: utf-8 -*- from django.shortcuts import render def hello(request): test_view = 10240 return render(request,"test.html","test":test_view)
- 修改test.py文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <p> test | filesizeformat </p> </body> </html>
- 访问页面
4、date
-
date会根据指定格式对一个日期变量进行格式化,格式
Y-m-d H:i:s
返回年-月-日 时:分:秒
的格式时间 -
下面来看案例:
- 修改index_test.py视图文件
#-*- coding: utf-8 -*- from django.shortcuts import render import datetime def hello(request): test_view = datetime.datetime.now() return render(request,"test.html","test":test_view)
- 修改test.py文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <p> test | date:"Y-m-d H:i" </p> </body> </html>
- 访问页面
5、truncatechars
-
truncatechars可以截断字符串,
如果字符串包含的字符总数多于指定的字符数量
,那么多出的部分会被截断,只剩余指定数量的字符 -
下面来看案例:
- 修改index_test.py视图文件
#-*- coding: utf-8 -*- from django.shortcuts import render def hello(request): test_view = "测试!!案例??" return render(request,"test.html","test":test_view)
- 修改test.py文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <p> test | truncatechars:4 </p> </body> </html>
- 访问页面
6、safe
-
Django 会自动对视图文件传到HTML文件中的标签语法进行转义,令其语义失效
。而加 safe 过滤器是告诉 Django 该数据是安全的,不必对其进行转义,可以让该数据语义生效。 -
safe会将字符串标记为安全,不需要转移,但是
需要保证视图文件传过来的数据是绝对安全,才能使用safe
-
safe和后端视图文件的mark_safe效果相同
-
下面来看案例
- 修改index_test.py视图文件
#-*- coding: utf-8 -*- from django.shortcuts import render def hello(request): test_view = "<a href='https://www.baidu.com/'>点击跳转</a>" return render(request,"test.html","test":test_view)
- 修改test.py文件,先看不加safe的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <p> test </p> </body> </html>
- 访问
- 现在加上
safe
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <p> test | safe </p> </body> </html>
- 访问页面,可以进行跳转
- if/else标签
if/else
基本语法格式:
% if condition %
... display
% endif %
或
% if condition1 %
... display 1
% elif condition2 %
... display 2
% else %
... display 3
% endif %
-
可以根据条件判断是否输出,并且
if/else
支持嵌套 -
% if %标签接收
and
、or
、not
等关键字对多个变量进行判断,这点和python基础的流程控制是一样的 -
下面来看案例:
- 修改index_test.py视图文件
#-*- coding: utf-8 -*- from django.shortcuts import render def hello(request): test_view = 95 return render(request,"test.html","test":test_view)
- 修改test.py文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> %if test > 90 and test <= 100 % 优秀 % elif test > 60 and test <= 90 % 合格 % else % 一边玩去~ % endif % </body> </html>
- 访问页面
- for标签
-
% for %
允许我们在一个序列上迭代,与Python中的for循环类似,每一次循环中,模板系统会渲染在% for %
和% endfor %
之间的所有内容 -
下面来看案例:
- 修改index_test.py视图文件
#-*- coding: utf-8 -*- from django.shortcuts import render def hello(request): test_view = ["aaa","bbb","ccc","ddd","eee"] return render(request,"test.html","test":test_view)
- 修改test.py文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> % for i in test % i % endfor % </body> </html>
- 访问页面
- 给标签增加一个
reversed
可以使列表被反向迭代:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> % for i in test reversed % #添加reversed 以上是关于Django模板标签的主要内容,如果未能解决你的问题,请参考以下文章