每一个Web框架都需要一种很便利的方法用于动态生成HTML页面。 最常见的做法是使用模板。

模板包含所需HTML页面的静态部分,以及一些特殊的模版语法,用于将动态内容插入静态部分。

说白了,模板层就是如何往HTML文件中填入动态内容的系统。

Django可以配置一个或多个模板引擎(语言),也可以不用引擎。

Django自带一个称为DTL(Django Template Language )的模板语言,以及另外一种流行的Jinja2语言(需要提前安装,pip install Jinja2)。

Django为加载和渲染模板定义了一套标准的API,与具体的后台无关。加载指的是,根据给定的模版名称找到的模板然后预处理,通常会将它编译好放在内存中。渲染则表示,使用Context数据对模板插值并返回生成的字符串。

DTL作为Django原生的模板系统,一直到Django1.8,都是唯一的内置模版系统,可能你对它有些意见,但是它仍然是一个优秀的模版库。如果没有特别重要的理由,需要选择另外一种模版系统的话,建议坚持使用DTL,特别是在编写可插拔的应用并打算发布其模板的时候。Django很多内部组件都使用了DTL,例如django.contrib.admin,如果你不想让它们罢工,或者花费大力气进行修改,不要放弃DTL。

一、 配置引擎

模板引擎通过settings中的TEMPLATES设置来配置。这是一个列表,与引擎一一对应,每个元素都是一个引擎配置字典。由startproject命令生成的settings.py会自定定义如下的值:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]

BACKEND:后端。内置的后端有django.template.backends.django.DjangoTemplatesdjango.template.backends.jinja2.Jinja2

OPTIONS中包含了具体的后端设置。

由于绝大多数引擎都是从文件加载模板的,所以每种模板引擎都包含两项通用设置:

  • DIRS:定义了一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件。
  • APP_DIRS:告诉模板引擎是否应该进入每个已安装的应用中查找模板。通常请将该选项保持为True。

每种模板引擎后端都定义了一个惯用的名称作为应用内部存放模板的子目录名称。(例如Django为它自己的模板引擎指定的是 ‘templates’,为jinja2指定的名字是‘jinja2’)。尤其是,django允许你有多个模板引擎后端实例,且每个实例有不同的配置选项。 在这种情况下你必须为每个配置指定一个唯一的NAME .

DTL引擎的OPTIONS配置项中接受以下参数:

  • 'autoescape':一个布尔值,用于控制是否启用HTML自动转义功能。默认为True。
  • context_processors: 以"."为分隔符的Python调用路径的列表。默认是个空列表。
  • 'debug':打开/关闭模板调试模式的布尔值。默认和setting中的DEBUG有相同的值。
  • 'loaders':模板加载器类的虚拟Python路径列表。默认值取决于DIRS和APP_DIRS的值。
  • string_if_invalid:非法变量时输出的字符串。默认为空字符串。
  • file_charset:用于读取磁盘上的模板文件的字符集编码。默认为FILE_CHARSET的值。
  • 'libraries':用于注册模板引擎。 这可以用于添加新的库或为现有库添加备用标签。
  • 'builtins':以圆点分隔的Python路径的列表。

二、 简单的用法

django.template.loader中定义了两个函数以加载模板。

get_template(template_name,using = None)[source]

该函数使用给定的名称查找和加载模板,并返回一个Template对象。

模板的查找和加载机制取决于每种后端引擎和配置,如果想使用指定的模板引擎进行查找,请将模板引擎的NAME赋给get_template的using参数。

select_template(template_name_list,using = None)[source]

和get_template()相似, 只不过它使用包含模板名称的列表作为参数。

select_template()get_template()返回的Template对象都必须提供一个render()方法,如下所示:

Template.render(context=None, request=None)

通过给定的context对该模板进行渲染。

如果提供了context,那么它必须是一个dict对象。如果要提供request参数 ,必须使用HttpRequest对象。

针对下面的TEMPLATES配置,对模版文件的搜索顺序和路径如下:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
'/home/html/example.com',
'/home/html/default',
],
},
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
'/home/html/jinja2',
],
},
]

如果你调用函数get_template('story_detail.html'), Django将按以下顺序查找story_detail.html

/home/html/example.com/story_detail.html('django'引擎)
/home/html/default/story_detail.html('django'引擎)
/home/html/jinja2/story_detail.html('jinja2'引擎)

如果你调用函数select_template(['story_253_detail.html','story_detail.html']),Django按以下顺序查找:

/home/html/example.com/story_253_detail.html('django'引擎)
/home/html/default/story_253_detail.html('django'引擎)
/home/html/jinja2/story_253_detail.html('jinja2'引擎)
/home/html/example.com/story_detail.html('django'引擎)
/home/html/default/story_detail.html('django'引擎)
/home/html/jinja2/story_detail.html('jinja2'引擎)

注意:Django查找到任何一个匹配的模板后便停止搜寻,所以这是个类似url搜索的短路操作!

强调:前面我们介绍过,建议在每个APP的的模版子目录下都建立一个子目录来唯一对应这个APP。这样做可以增强你的APP的可用性。 将所有的模版文件放在根模版目录下会引发混淆。

要在一个子目录内加载模板,像下面这样:

get_template('news/story_detail.html')

如果结合上面例子中的TEMPLATES配置,这将会尝试按顺序查找并加载下列模板︰

/home/html/example.com/news/story_detail.html('django'引擎)
/home/html/default/news/story_detail.html('django'引擎)
/home/html/jinja2/news/story_detail.html('jinja2'引擎)

另外,为了减少加载模板、渲染模板等重复工作,django提供了处理这些工作的快捷函数。

render_to_string(template_name, context=None, request=None, using=None)[source]

render_to_string()会像get_template()一样加载模板并立即调用render()方法。 它需要以下参数。

  • TEMPLATE_NAME:要加载的模板的名称或列表。
  • context:要用作模板的上下文进行渲染的数据字典,也就是你要插入的动态数据字典。
  • request:可选的HttpRequest对象。
  • using:指定使用的模板引擎NAME。 搜索模板将仅限于该引擎。

用法示例:

from django.template.loader import render_to_string
rendered = render_to_string('my_template.html', {'foo': 'bar'})

三、基本语法

以后,如果没有特别强调,都是针对DTL引擎。

Django模板语言的语法包括四种结构。

1. 变量

变量的值来自context中的数据字典, 类似于字典对象的keys到values的映射关系。

变量是被}}{{括起来的部分,例如:

My first name is {{ first_name }}. My last name is {{ last_name }}.

假如有一个上下文{'first_name': 'John', 'last_name': 'Doe'},模板渲染后的真实值为:

My first name is John. My last name is Doe.

字典查询,属性查询和列表索引查找都是通过圆点符号.来实现。所以圆点在模版引擎中是万能的上帝,不知道该怎么写下去的时候,就尝试点点点....:

{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}

2. 标签

模版语言中的标签类似Python中的函数,功能多样,使用灵活。可以输出内容、控制结构,甚至可以访问其他的模板标签。

标签是由%}{%来定义的,例如:

{% csrf_token %} # csrf令牌标签

大部分标签都接受参数:

{% cycle 'odd' 'even' %} # 循环使用'odd'和'even'

部分标签需要使用起始和闭合标签,典型代表为for循环标签和if判断标签:

{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}

3. 过滤器

过滤器用于修改变量或标签参数的值。例如下面这样:

{{ django|title }}

如果有一个上下文{'django': 'the web framework for perfectionists with deadlines'},那么模板最终呈现:

The Web Framework For Perfectionists With Deadlines # 所有的单词首字母大写了

有些过滤器还接收一个参数:

{{ my_date|date:"Y-m-d" }} # 按指定的格式"Y-m-d",显示日期

4. 注释

模版语言的注释看起来像这样:

{# this won't be rendered #} # 单行注释

{% comment %}标签提供多行注释功能。

详细教程

Django模板语言详解

Django内置模板标签

Django内置模版过滤器

django特殊的标签和过滤器

django人类可读性

django自定义模板标签和过滤器

模版层Template layer的更多相关文章

  1. 63、django之模版层(template)

    上篇主要介绍了django的MTV模型,主要介绍了视图层之路由配置系统url分发和视图层之视图函数view,本篇主要讲解MTV模型中的模版层template. 模版层(template) 一.模版简介 ...

  2. django之模版层(template)

    上篇主要介绍了django的MTV模型,主要介绍了视图层之路由配置系统url分发和视图层之视图函数view,本篇主要讲解MTV模型中的模版层template. 本篇导论: 模版简介 模版之变量 模版之 ...

  3. Django---->模板层(template)

    模板层(template) 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. 1 2 3 4 def current_datetime ...

  4. DjangoMTV模型之视图层views及模板层template

    Django视图层中views的内容 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容(render),也可以是一个重定向( ...

  5. Django--路由层、视图层、模版层

    路由层: 路由匹配 url(正则表达式,视图函数内存地址) 只要正则匹配到了内容,就不再往下匹配,而是直接运行后面的视图函数 匹配首页) url(r'^&', home) 匹配尾页 url(r ...

  6. Django之模版层

    一.模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别,也就是说,HTML被直接硬编码在python代码之中. def current_datetime(request): now = ...

  7. 6.-Django设计模式及模版层

    一.MVC (java等其他语言) MVC代表Model-view-Contorller(模型-视图-控制器)模式 M模型层主要用于对数据库层的封装 V视图层用于向用户展示结果 C控制器用于处理请求. ...

  8. 弹层组件-layer

    layer是Layui的一个弹层组建,功能强大,总之我很喜欢,下面介绍这个组件的基本用法. 首先如果只需要使用layer而不想使用Layui可以单独下载layer组件包,页面引入jquery1.8以上 ...

  9. 模版(template)

    模版(template) 在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字 ...

随机推荐

  1. nodejs加WebSocket,聊天工具

    1.WebSocket必须要与服务器连接,所以这里采用node起服务,这里用到了ws,,也有人用nodejs-websocket 2.首先 npm install ws 3.新建一个server.js ...

  2. map() 方法

    1. 方法概述 map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组. 2. 例子 2.1 在字符串中使用map 在一个 String 上使用 map 方法获取字符串中每 ...

  3. vue性能优化1--懒加载

    懒加载也叫延迟加载,即在需要的时候进行加载.随用随载.为什么需要懒加载?像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间 ...

  4. VS相关设置

    1.显示行号 工具-〉选项-〉文本编辑器-〉语言(比如C#)-〉显示-〉行号 2.“解决方案资源管理器”被拖出来了,无法还原 两种方法:1.窗口-->重置窗口布局2.工具-->导入和导出设 ...

  5. Linux服务器---配置apache支持php

    apache支持php php是最好用的服务器语言了,Apache对php有很强大的支持 1.检测是否安装php,如果什么信息也没有,那么你就要自己安装php了 [root@localhost ~]# ...

  6. ab命令压力测试

    网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环.只有让服务器处在高压情况下,才能真正体现出软件.硬件等各种设置不当所暴露出的问题. 性能测试工具目前最常见的有以下几种:ab.http_lo ...

  7. Notes of Head.First.HTML.and.CSS.2nd.Edition

    What does the web server do? tirelessly waiting for requests from webbrowsers What does the web brow ...

  8. (二)github的价值意义篇

    为什么需要社会化编程? 如果您是程序员面试官,两者之间你会选择哪一位呢? 能查看以前所写代码的程序员 or 无法查看的程序员 精通最新软件的程序员 or 不精通的程序员 对语言或软件差异带来的不同文化 ...

  9. PHP实现多进程并行操作,可做守护进程(转,备用)

    <?php /** * 入口函数 * 将此文件保存为 ProcessOpera.php * 在terminal中运行 /usr/local/php/bin/php ProcessOpera.ph ...

  10. Django 将数据库查出的 QuerySet 对象转换为 json 字符串

    通过Django查询出MySQL数据库的数据,并将查询出的QuerySet 对象转化成 json 字符串. 写这个例子的作用主要是用来为手机端提供接口用,记录一下,以后 说不准 肯定能用到! ---- ...