这是Django MTV开发模式中的 T模块 —— 模板系统, 作为django的一个非常重要的部分,也是我们学习的一个重要点。
官方定义: 作为一个Web框架,Django需要一种动态生成HTML的便捷方法。最常用的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述动态内容将被插入的一些特殊语法。
这篇文章主要介绍了关于 django 的模板系统 T 层。工具: pycharm 2020
< django 从入门到放弃
> 第五篇
沙漏在下雨
文章目录
-
- 模板系统:
- 模板的配置:
- 模板的加载和响应方式:
- render() 方式解释:
模板系统:
在 Django 中我们把“模板”称之为 Template,它的存在使得 HTML 和 View 视图层实现了解耦。 在去 前文 MTV 开发模式中我们也提到过 Template,它是设计模式中的 T 层,那么它在 Djang 中又是如何应用的呢?
其实 T 层应用是这样实现,当创建好一个 Django 项目后,我们在项目的同级目录下创建一个名为 templates 文件夹,对它进行简单的配置后,这个文件夹将被 Django 自动识别。我们可以简单的理解为:文件夹就好比我们所说的 T 层,然而其复杂的实现过程由 Django 框架本身来实现的,所以我们无需关心内部细节。
模板的配置:
在 Django 中,模板是可以根据字典数据动态变化的,并且能够根据视图中传递的字典数据动态生成相应的 HTML 网页。Django 中使用 Template 来表示模板,Template 对象定义在 django/template/base.py 文件中,它的构造函数源码如下:
def __init__(self, template_string, origin=None, name=None, engine=None):
# If Template is instantiated directly rather than from an Engine and
# exactly one Django template engine is configured, use that engine.
# This is required to preserve backwards-compatibility for direct use
# e.g. Template('...').render(Context({...}))
if engine is None:
from .engine import Engine
engine = Engine.get_default()
if origin is None:
origin = Origin(UNKNOWN_SOURCE)
self.name = name
self.origin = origin
self.engine = engine
self.source = str(template_string) # May be lazy.
self.nodelist = self.compile_nodelist()
这个源码看不懂没关系, 按照步骤来, 都是这么来的。
- 首先 新建 templates 于 nowapp 下一级的目录下,如下:
├─nowapp
│ ├─migrations
│ │ └─__pycache__
│ ├─templates
│ └─__pycache__
└─nowproject
└─__pycache__
- 然后在setting.py 文件中,找到TEMPLATES, 按照如下设置
- 主要是增加 DIRS 里面的模板位置
# setting.py
import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'nowapp\\templates\\')],
'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',
],
},
},
]
其中关于TEMPPLAETS的字段解释:
- BACKEND : Django默认设置,指定了要是用的模板引擎的 Python 路径;
- DIRS : 一个目录列表,指定模板文件的存放路径,可以是一个或者多个。模板引擎将按照列表中定义的顺序查找模板文件;
- APP_DIRS : 一个布尔值,默认为 Ture。表示会在安装应用中的 templates 目录中搜索所有模板文件;
- OPTIONS : 指定额外的选项,不同的模板引擎有着不同的可选参数,例如 context_processors 用于配置模板上下文处理器,在使 RequestContext 时将看到它们的作用。
模板的加载和响应方式:
关于模板的加载和响应方式,django提供了2中方式,
- 使用 loader 获取模板, 然后使用 HttpResponse 进行响应
- 直接使用 render 方法加载响应模板 (主要使用这个方法 )
方法介绍如下:
from django.template import loader # 导入loader方法
from django.shortcuts import render #导入render 方法
#方式一
def test_html(request):
t=loader.get_template('test.html')
html=t.render({ 'name':'第一种'} #以字典形式传递数据并生成html
return HttpResponse(html) #以 HttpResponse方式响应html
#方式二
from django.shortcuts import render #导入reder方法
def test_html(request):
return render(request,'test.html',{ 'name':'第二种'})#根据字典数据生成动态模板
# 方式二的其他方式(推荐)
def test_html(request):
name = "第二种"
return render(request, 'test.html', locals())
render() 方式解释:
renbder 方法的作用是结合一个给定的模板和一个给定的字典,并返回一个渲染后的 HttpResponse 对象。通俗的讲就是把字典格式的内容, 加载进 templates 目录中定义的 HTML 文件, 最终通过浏览器渲染呈现. 关于render 我们查看他的源码,发现他的构造方式如下:
render(request, template_name,
context=None,
content_type=None,
status=None,
using=None)
关于参数的含义如下:
-
request: 是一个固定参数,用于生成响应的请求对象, 这个一定要填入 ;
-
template_name: templates 中定义的文件, 要注意路径名, 一般使用 nowapp/test.html ;
-
context: 要传入文件中用于渲染呈现的数据, 默认是字典格式, 或者直接使用 locals() 直接把所有参数构造成字典返回;
-
content_type: 生成的文档要使用的媒体格式类型。默认为 DEFAULT_CONTENT_TYPE 设置的值;
-
status: http 的响应代码,默认是 200;
-
using: 用于加载模板使用的模板引擎的名称。
其中关于 content_type 这个参数其实有很多字段描述的, 找到了一个资料,如下:
- 1. text/html : HTML 格式
- text/csv: csv格式
- text/plain :纯文本格式
- text/xml : XML 格式
- image/gif :gif 图片格式
- image/jpeg :jpg 图片格式
- image/png:png 图片格式
- application/xhtml+xml :XHTML 格式
- application/xml: XML 数据格式
- application/atom+xml :Atom XML 聚合格式
- application/json: JSON 数据格式
- application/pdf:pdf 格式
- application/msword :Word 文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded :form 表单数据被编码为
- key/value 格式发送到服务器(表单默认的提交数据的格式)。
- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
下一篇博客我们介绍一下关于Django 模板的四大组成部分, 变量, 标签, 过滤器,以及注释, 翻译至官网文档,不足之处请指教。
ps: 文章主要是用来记录自己的学习情况, 很多我也不会,也就是个菜鸡了。