Django的 模块Templates
前言
Django的框架设计模式中,有一种叫MTV模式 , Model-Template-View(模型-模板-视图,这种模式用于应用程序的分层开发.
今天小编要写的就是MTV模式中的 Template模板
版本
- python:3.10.12
- Django:3.2.12
简述Django框架MTV
- 作用: 降低模块间的耦合度
- MTV
- M --模型层 负责与数据库交互
- V --视图层 是核心,负责接收请求、获取数据、返回结果
- T --模板层 负责呈现内容到浏览器 (这是今天所写重点)
模板
- 什么是模板
1.模板是可以根据字典动态变化的Html网页
2.模板可以根据视图中传过来的字典数据动态变化生成相对应的HTML网页
- 解析模板
- 反向思考一下,如果说不使用模板,如何在浏览器中显示一个页面
1.首先urls.py函数中,可以先写路由地址 以及 调用的视图函数名字
2.然后在views.py函数中写一个视图函数,写一个html的字符串,比如 html="<h1>我是html</h1>"
3.写完整的需要 html =""" xxx """,这个xxx就是html整个架构那个(含head和body那个架构)
4.然后就是返回html
- 以上就可以在浏览器中显示一个html页面,可以看到主要逻辑实际都是在views.py函数中写的. 如果说上面逻辑步骤有不清楚或者迷糊的地方,请多复习.
- 缺点
1. 可以看到前端与后端部分全部写在view.py文件里面了,耦合端太高了.
2. 可读性不好,假如说代码有问题,你会发现它非常长,你很难去精准的找到问题所在
- 引出模板
- 模板作用就是把前端部分 分离到另一个函数中
- Django自己定义了一套模板的语法,可以智能简洁的使用模板里的HTML页面
- 接下来我将介绍模板的语法,以及如何运用,让HTML页面显示到浏览器中
模板的配置
- 创建模板文件夹--> 位置 与 manage.py同级 `<项目名>/templates`
- 找到settings.py,里面有一个 TEMPLATES变量
1.BACKEND:制定模板引擎
2.DIRS:模板的搜索目录(可以是一个,也可以是多个)
....(后面简略)
- DIRS这个属性,如果大家对linux命令熟悉的话,应该可以知道概念,dir可以展示当前目录的文件夹,这个DIRS是用来写路径的
- 路径方式:
- 绝对路径:完整路径,比如说 '/home/user/code/Django01/templates' 这个是创建的templates模板文件夹路径
缺点:
1. 可以看到一个是麻烦,另一个是假如这个项目不是你写的,路径就对不上了
2. 假如你一旦修改了这个项目的位置,也会报错,找不到路径
- 解决方式:
- 在settings.py文件中,大概在17行左右(每个人位置不一定相同,但应该都在开头部分)有 BASE_DIR 的变量
- BASE_DIR实际上就是Django通过它本身的代码所定义的当前项目位置路径
- 所以在DIRS中可以使用 BASE_DIR表示当前项目位置,再加上 templates/
- 注意点:
- DIRS[BASE_DIR + "/templates/"],大家能做到这,说明上面理解了,但是这个有问题
- 问题点实际就是不同系统的路径表示方式,比如 Windows系统用 \ , 甚至有时还有转义符号,而linux上,用 /
- 为了保证不同系统的路径一致性,需要用一个函数 os.path.join(),os需要导入
- DIRS[os.path.join(BASE_DIR,templates)]
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
/*
os.path.join:
Python 中用于路径拼接的函数,它属于 os.path 模块。这个函数的主要作用是将一个或多个路径片段拼接成一个完整的路径。它在处理文件路径时非常有用,因为它可以确保路径在不同操作系统中的正确性,比如 Windows 和 Unix/Linux 系统之间的路径分隔符差异
*/
解析:
模板:html文件
views.py:加载模板(html),返回给浏览器
模板的加载方式
- 通过 loader 获取模板,通过HttpResponse进行响应
from django.template import loader
# 1.通过loader加载模板
t = loader.get_template("模板文件名") # 找模板文件
# 2.将t转换成 HTML 字符串
html = t.render(字典数据 ) # 给动态的html数据填写数据
# 3.用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(html)
例如:
t = loader.get_template('xxx.html')
html = t.render(字典数据)
return HttpResponse(html)
- 使用render()直接加载并响应模块
from django.shortcuts import render
return render(request,'模板文件名', 字典数据)
例如:
return render(request,'xxx.html',字典数据)
建议:我个人是感觉第二种更好用,因为简洁.
字典数据:这个是给html中一些参数填取信息的,在django中,html遵从模板的语法,注意这个是字典
模板变量
说明:下面这个语法很多,很多我自己也没使用过,{{ 变量名 }}是使用过最多的,django的模板语法很弱,需要的时候查用法即可
下面这个看不懂直接看案例就明白了
-
在模板中使用变量语法(这个实际上就是个可以赋值的变量)
{{ 变量名 }}
{{ 变量名.index }}
{{ 变量名.key}}
{{ 对象.方法 }}
{{ 函数名 }}
- 视图函数中必须将变量封装到字典中才允许传递到模板上
def xxx_view(request) dic = { "变量1":"值1", "变量2":"值2", } return render(request, 'xxx.html', dic)
解析:
1.完成模板的配置,然后目光聚焦在 views.py与templates中,templates创建 xxx.html 文件
2.首先就是原来在views中html部分可以写在你所创建的html文件中
我的编辑器是vscode,在templates创建的html文件却在语法上没有提示,这很烦恼,如果有和我一样的小伙伴可以
把后缀名改为htm,它就支持了,但是需要注意,当你要使用模板语法的时候还是需要修改回来.
3. 大家不用觉得麻烦,模板语法很弱,所以比重非常低,大部分都是html,写完html部分再写需要的模板语法
模板语法
模板的标签
-
作用
- 将一些服务器端的功能嵌入到模板中
- 模板的语法很弱,所以一些比较复杂的逻辑应该放大views函数中
-
标签语法
{% 标签 %} ... {% 结束标签 %}
-
if 标签
{% if 条件表达式1 %} ... {% elif 条件表达式2 %} ... {% elif 条件表达式3 %} ... {% else %} ... {% endif %}
-
if 标签里的布尔运算符
- if 条件表达式里可以用的运算符 ==, !=, <, >, <=, >=, in, not in, is, is not, not、and、or
- 在if标签中使用实际括号是无效的语法。 如果您需要它们指示优先级,则应使用嵌套的if标记。
-
locals函数的使用
locals() 返回当前函数作用域内全部局部变量形成的字典。
比如说views视图函数中,request接收的是一个,而自定义的变量也是,于是可以简便写 def text_view(request): # dict={ # "x":10 # } x = 0 return render(request,'text222.html',locals())
这里推荐大家使用locals(),因为只要在视图函数里定义的变量,它都可以直接转换成字典返回,简洁干净
…(实际上还有for的标签语法等等,大家如果需要可以自行了解,模板语法占比一般不多,所以这省略了)
案例说明以及练习
# views.py 中
# 原有导入的文件都不要动,这里省略不写
from django.shortcuts import render
def text_view(request):
dict={
"x":10
}
return render(request,'text222.html',dict)
# path.py 中
from . import views
# 在urlpatterns里添加一行路由
path('text/',views.text_view)
<!-- 在templates/text222.html中-->
<!-- text222.html就是我在templates里创建的html文件-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 模板语法中空格都不能出现错误,基本一个东西空一格-->
<!-- {{x}} 这个就是视图函数里需要填写的字典数据,{{x}} 会整个替换成 value值-->
{% if x > 0 %}
<h1>{{ x }}大于0</h1>
{% elif x == 0 %}
<h1>{{ x }}等于0</h1>
{% elif x < 0 %}
<h1>{{ x }}小于0</h1>
{% endif %}
</body>
</html>
-
运行(代码记得保存 ctrl+s)
- 终端: python3 manage.py runserver
-
浏览器访问
- http://127.0.0.1:8000/text/
-
页面显示
- 10大于0
-
查看源代码
- 浏览器中F12,可以发现 body里面只有
<h1>10大于0</h1>
- 浏览器中F12,可以发现 body里面只有
结语
关于模板实际还有过滤器和继承以及url反向解析等相关内容,大家可以自行去了解,祝大家编程愉快