django基础入门(6)-模板

来源:互联网 发布:深圳网络指尖公司 编辑:程序博客网 时间:2024/05/18 22:54

如果我们的视图想给用户返回漂亮的页面,就需要在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哪一行为配置模板的根目录,以后模板就会在这个目录下去搜索。配置模板搜索路径, 当获得模板时候从此目录下读取模板.
编写视图函数,django.template.loader 定义了get_template()函数以加载模板。get_template()函数使用给定的名称加载模板并返回一个Template对象.

get_template()函数返回的Template对象,该类型对象有个render(context=None)函数,可用于对Template类型模板进行渲染(渲染是指使用context 数据对模板插值并返回生成的字符串).

修改我们news_app目录下的views.py模块中的index视图函数如下:

from django.shortcuts import renderfrom django.http import HttpResponsefrom django.template import loaderdef 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 renderdef 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/,看到显示结果为: