问题:如何向请求者返回一个漂亮的页面呢?
肯定需要用到html、css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串要全都写到视图中,作为HttpResponse()的参数吗?这样定义就太麻烦了吧,因为定义字符串是不会出任何效果和错误的,如果有一个专门定义前端页面的地方就好了。
解决问题的技术来了:模板。
在Django中,将前端的内容定义在模板中,然后再把模板交给视图调用,各种漂亮、炫酷的效果就出现了。
创建模板
首先需要在根目录下新建文件夹templates
(使用pycharm新建django的时候会自带)。
之后在setting.py
里面的TEMPLATES
中加入templates
文件夹的路径,添加后的TEMPLATES
如下:
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',
],
},
},
]
- (Pycharm创建的Django项目也会自动添加)
为应用booktest下的视图index创建模板index.html,目录结构如下图:
定义模板
打开templtes/booktest/index.html
文件,定义代码如下:
<html>
<head>
<title>图书列表</title>
</head>
<body>
<h1>{{ title }}</h1>
{% for i in list %}
{{ i }} <br>
{% endfor %}
</body>
</html>
- 在模板中输出变量语法如下,变量可能是从视图中传递过来的,也可能是在模板中定义的。
{{变量名}}
- 在模板中编写代码段语法如下:
{%代码段%}
- 上面的
{% for i in list %}
{% endfor %}
就是for循环的写法。
视图调用模板
调用模板分为三步骤:
- 1.找到模板
- 2.定义上下文
- 3.渲染模板
打开booktst/views.py
文件,调用上面定义的模板文件
from django.http import HttpResponse
from django.template import loader,RequestContext
def index(request):
# 1.获取模板
template=loader.get_template('booktest/index.html')
# 2.定义上下文
context=RequestContext(request,{'title':'图书列表','list':range(10)})
# 3.渲染模板
return HttpResponse(template.render(context))
- 注意新版本不再需要RequestContext,只需要给context定义一个列表即可,或者使用下面的简写方式
视图调用模板简写
视图调用模板都要执行以上三部分,于是Django提供了一个函数render
封装了以上代码。 方法render
包含3个参数:
- 第一个参数为request对象
- 第二个参数为模板文件路径
- 第三个参数为字典,表示向模板中传递的上下文数据
打开booktst/views.py
文件,调用render
的代码如下:
from django.shortcuts import render
def index(request):
context={'title':'图书列表','list':range(10)}
return render(request,'booktest/index.html',context)
打开浏览器刷新页面,显示效果如下图: