Django 的设计模式及模板层
一、MVC 和 MTV
1、MVC(传统)
Model-View-Controller
(模型-视图-控制器)模式;【M
】-主要用于对数据库层的封装;【V
】-用于向用户展示结果(What+How
);【C
】-用于处理请求、获取数据、返回结果(重要
)- 作用:降低模块间的耦合度(
解耦
)
2、MTV(Django)
Model-Template-View
(模型-模板-视图)模式;【M
】-负责与数据库交互;【T
】-负责呈现内容到浏览器(How
);【V
】-是核心,负责接收请求、获取数据、返回结果(What
)
3、T(模板层)
- 模板是可以根据字典数据动态变化的
html
网页 - 模板可以根据视图中传递的字典数据动态生成相应的
HTML
网页
3.1、模板配置
创建模板文件夹:
<项目名>/templates
在
settings.py
中TEMPLATES
配置项BACKEND
:指定模板的引擎DIRS
:模板的搜索目录(可以是一个或者多个)APP_DIRS
:是否要在应用中的 templates` 文件夹中搜索模板文件OPTIONS
:有关模板的选项- 配置项中需要修改的部分:设置
DIRS - 'DIRS':[os.path.join(BASE_DIR, 'templates)]
模板的加载方式
- 方案1:通过
loader
获取模板,通过HttpREsponse
进行响应 - 方案2:使用
render()
直接加载并响应模板
- 方案1:通过
视图层与模板层之间的交互:
- 视图函数中可以将 `Python 变量封装到 字典 中传递到模板
- 模板中,我们可以用
{{变量名}}
的语法,调用视图传进来的变量
3.2、变量与标签
a、变量
- 视图函数中可以将
Python
变量封装到字典中传递到模板上:str
- 字符串;int
- 整型;list
- 数组;tuple - 元组;
dict- 字典;
func- 方法;
obj` - 类实例化的对象 - 模板替换类似于
python
模块template
,类似的规则
- 视图函数中可以将
b、标签
将一些服务器端的功能嵌入到模板中,例如流程控制等
标签语法:
{% 标签 %} … {% 结束标签 %}
if
标签:if
条件表达式里可以用的运算符:==
、!=
、<
、>
、>=
、<=
、in
、not in
、is
、is not
、not
、and
、or
- 在
if
标记中使用实际括号是无效的语法,如果需要它们指示优先级,则应使用嵌套的if
标记。
for
标签:- 语法:
{% for 变量 in 可迭代对象 %} … 循环语句 {% empty %} …` 可迭代对象无数据时填充的语句 `{% endfor %}
- 内置变量:
forloop
- 语法:
3.3、过滤器和继承
过滤器
- 定义:在变量输出时对变量的值进行处理
- 作用:可以通过使用 过滤器 来改变变量的输出显示
- 语法:
{{ 变量 | 过滤器1:‘参数值1’| 过滤器2:‘参数值2’…}}
(可以在 模板文件 输出参数的地方添加 | 进行添加过滤) - 官方文档:
- 常用过滤器:
lower
- 将字符串转换为全部小写upper
- 将字符串转换为全部大写safe
- 默认不对变量内的字符串进行 html 转义add:"n"
- 将value
的值增加n
truncatechars:"n"
- 若字符串字符多于指定的字符数量,那么会被截断,截断的字符串将以可翻译的省略号序列(‘…
’)结尾。
继承
- 定义:模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块
- 语法:
- 父模板中:定义父模板中的块
block
标签;标识出哪些在子模版中是允许被修改的;block
标签:在父模板中定义,可以在子模板中覆盖 - 子模板中:继承模板
extends
标签(写在模板文件的第一行),例如{% extends 'base.html' %}
- 子模板 重写父模板中的内容块;
{% block block_name %}` 子模板块用来覆盖父模板中 `block_name` 块中的内容 `{% endblock block_name %}
- 子模板 重写父模板中的内容块;
- 父模板中:定义父模板中的块