如果我们的视图想给用户返回漂亮的页面,就需要在python代码中编写很多html css的代码。这会导致一些问题的出现, 例如:
1. 任何页面的改动会牵扯到Python代码的改动, 网站的设计改动会比Python代码改动更频繁,所以如果我们将两者分离开会更方便;
2. 后台Python代码与设计HTML是不同的工作,页面设计人员应该编辑Python代码,他们应该与HTML打交道;
3. 程序员写后台程序同时页面设计人员写HTML模板会更高效,而不是一个人等待另一个人编辑同样的文件.因此,使用Django的模板系统分离设计和Python代码会更干净更易维护.
作为Web 框架,Django 需要一种很便利的方法以动态地生成HTML。最常见的做法是使用模板。模板包含所需HTML 输出的静态部分,以及一些特殊的语法,描述如何将动态内容插入.
Django 项目可以配置一个或多个模板引擎。Django 的模板系统自带内建的后台 ——称为Django 模板语言(DTL),以及另外一种流行的Jinja2。
Django 模板语言 是Django 原生的模板系统。尽管它闭门造车,并且偏重某些方面,但是它仍然是一个优秀的模版库。如果没有特别紧急的理由选择另外一种后台,你应该使用DTL。Django 中包含模板的标准应用,例如django.contrib.admin,都使用DTL。
模板简言之:就是混合了模板语言的html文件.
1. 配置模板
如何让视图找到模板文件? 我们需要配置模板的路径,以便djangon模板引擎能够找到并加载模板文件.在和news_app同级目录下创建文件夹templates目录,用于存放模板文件。
打开project/settings.py文件,将templates目录配置到django中,相关内容如下:
TEMPLATES = [
{
'BACKEND':'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
参数解释:
backend: 使用何种模板引擎;
dirs: 定义了一个目录列表,模板引擎按照列表顺序在这些目录中查找模板文件;
app_dirs: 是否进入已安装应用中查找模板. 每种模板引擎都定义了一个默认的名称作为搜索模板的子目录. 例如django为它自己的模板引擎指定的是 ‘templates’ ,为jinja2指定的名字是‘jinja2’.
2. 使用模板
TEMPLATES = [
{
'BACKEND':'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "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',
],
},
},
]
DIRS哪一行为配置模板的根目录,以后模板就会在这个目录下去搜索。配置模板搜索路径, 当获得模板时候从此目录下读取模板.
get_template()函数返回的Template对象,该类型对象有个render(context=None)函数,可用于对Template类型模板进行渲染(渲染是指使用context 数据对模板插值并返回生成的字符串).
修改我们news_app目录下的views.py模块中的index视图函数如下:
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader
def index(request):
# 从配置路径中加载模板
template = loader.get_template("app_news/index.html")
# 创建上下文(需要插入到模板中的数据)
context = {"title": "news title", "content": "news contents!"}
# 渲染模板
new_template = template.render(context)
return HttpResponse(new_template)
以上实现过于复杂,还有更简单方式:
from django.shortcuts import render
def index(request):
context = {"title": "news title", "content": "news contents!"}
return render(request, "app_news/index.html", context)
在templates目录下创建app_news目录,在app_news目录中创建模板文件(html文件),index.html,内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr><td>新闻标题:</td><td>{{title}}</td></tr>
<tr><td>新闻内容:</td><td>{{content}}</td></tr>
</table>
</body>
</html>
执行命令,python manage.py runserver启动测试服务器,在浏览器输入localhost:8000/index/,看到显示结果为: