通过Django中的模板,使得设计人员和网站管理有一个对接的接口,实现网页设计和逻辑的分离,因此,模板会处理大量的文本解析内容,django中内部使用了高效的引擎来完成模板解析。

模板设置

在使用模板前,需要对django进行配置,在项目目录的setting.py中,

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ‘/vagrant/realhealth/myapp/template',
        ],
        '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指定模板解析引擎,django中内置两个解析引擎:django.template.backends.django.DjangoTemplates 和 django.template.backends.jinja2.Jinja2 ;

DIRS 中配置模板路径列表,引擎会从该列表的路径中寻找相应的模板;

APP_DIRS 默认为True,指定是否从APP目录中寻找模板;

以及一些其他的配置。

由于模板会从设置中加载引擎,所以,必须对python环境变量加以配置:

1. 将项目目录添加到 PYTHONPATH 中

2. 将 mysite.settings 添加到 DJANGO_SETTINGS_MODULE 中,或者在模板使用时,添加 os.environ['DJANGO_SETTINGS_MODULE'] = ‘mysite.settings' ,其中mysite为你的项目名称

Template

从django源代码中,可以看到Template结构非常简单,由模板字符串、模板引擎、渲染方法三部分组成。模板字符串包含HTML框架以及一些模板语言,引擎将这个字符串以模板语言为分割,分成一个个node,并使用一些简短的正则表达式处理这些node:

import os
from django.template import Template
os.environ['DJANGO_SETTINGS_MODULE'] = 'realhealth.settings'

def test():
    t = Template('''Hi, {{ name }}, it is {{time}} now
{% if ordered %}
You are welcome!
{% else %}
Sorry, you are not ordered
{% endif %}
This is a very long long long long long long string
''')
    print(t)
    for node in t:
        print(node)

if __name__ == '__main__':
    test()

得到的输出结果为:

<django.template.base.Template object at 0x7f8cab56eb38>
<Text Node: 'Hi, '>
<Variable Node: name>
<Text Node: ', it is '>
<Variable Node: time>
<Text Node: ' now
'>
<Text Node: '
You are welcome!
'>
<Text Node: '
Sorry, you are not order'>
<Text Node: '
This is a very long long'>

可以看出,模板字符串被分成很多node,并且静态字符串由于不需要进行处理,会被简单的截断。

创建了模板后,需要通过render方法使用一个Context对象来对其进行渲染。

Context

Context对象中有一个类似于字典的结构,存储了模板中需要的关键字和值的映射。一个模板可以通过多个不同的Context对象渲染出不同的结果。Context的实现结构也非常简单:

可以看到,Context主要有current_app、bind_template、__copy__、update等方法。current_app和bind_template应该主要和渲染实现过程有关。由于Context是和字典类似的映射可变类型,所以有一个__copy__方法来实现硬拷贝,另外update方法也提示我们Context对象中的内容是可以被更新的。

下面是一个渲染的实例:

import os
import time
from django.template import Template,Context
os.environ['DJANGO_SETTINGS_MODULE'] = 'realhealth.settings'

def test():
    t = Template('''Hi, {{ name }}, it is {{time}} now
{% if ordered %}
You are welcome!
{% else %}
Sorry, you are not ordered
{% endif %}
This is a very long long long long long long string
''')
    time_str = time.strftime('%Y-%m-%d %X',time.localtime())
    c = Context({'name':'Lyon','time':time_str,'ordered':True})
    for i in c:
        print(i)
    t_1 = t.render(c)
    print(t_1)
    c = c.update({’name’:’Jake’,’ordered’:False})
    t_2 = t.render(c)
    print(t_2)

if __name__ == '__main__':
    test()

输出内容为:

{'name': 'Lyon', 'time': '2015-06-20 23:07:33', 'ordered': True}
{'False': False, 'None': None, 'True': True}
Hi, Lyon, it is 2015-06-20 23:07:33 now

Your are welcome!

This is a very long long long long long long string

Hi, Jake, it is 2015-06-20 23:07:33 now

Sorry, you are not ordered

This is a very long long long long long long string

这个输出中模板被多个换行分隔,提示我们,或许应该注意Template中的换行了。

Django学习日记04_模板_overview的更多相关文章

  1. Django学习日记05_模板_模板语言

    Variables 在模板中,使用两个大括号包含变量的方式来使用变量: {{ name }} 该变量应该作为键值对中的键,在Context中能被查找到. Tags 模板中使用Tags来进行简单的逻辑: ...

  2. Django学习笔记之模板

    模板 模板介绍 在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面. 目前市面上有非常多的模板系 ...

  3. Django学习日记06_视图_URLconf、View

    URLconf Django通过URLconf来响应网页请求,在项目设置settings.py中,设定了ROOT_URLCONF值来指定默认的URLconf(即mysite.urls),当HTTPRe ...

  4. Django学习日记02_项目环境

    创建一个工程: django-admin.py startproject mySite 将会产生以下文件: mySite/    manage.py    mySite/        __init_ ...

  5. Django学习总结之模板templates

    - django模板: templates - 模板分为两个过程: 1, 加载 : loader.get_template('xxx.html') 返回值是一个template对象 2, 渲染 : t ...

  6. Django学习笔记之模板渲染、模板语言、simple_tag、母版子版、静态配置文件

    一.首先我们用PyCharm来创建一个Django项目 终端命令:django-admin startproject sitename 图形创建:   这样一个Django项目就创建完成了,上面可以看 ...

  7. Django学习之 - 基础模板语言

    模板语言if/else/endif {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% else %} &l ...

  8. Django学习系列之模板系统

    一.模板标签 if/else {%  if  %}标签检查一个变量的值是否为真或者等于另外一个值,如果为真,系统会执行{%  if  %}和{%  endif  %}之间的代码块,例如: {% if ...

  9. Django学习系列之模板

    什么是django模板 模板是一个文本,用于分离文档的表现形式和内容,模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签) 模板通常用于产生HTML 如何使用模板 创建一个Tem ...

随机推荐

  1. CCF-201312-3-最大的矩形

    问题描述 试题编号: 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ ...

  2. upload 上传类

    <?php/**file: fileupload.class.php 文件上传类FileUpload本类的实例对象用于处理上传文件,可以上传一个文件,也可同时处理多个文件上传 */class U ...

  3. YiShop_商城网站建设应该注意什么

    现在电子商务迅速发展,而专门搭建商城网站的第三方开发商也很多.现在搭建一个商城网站容易,如何运营一个商城网站才是重点.下面就由YiShop说说电子商城网站建设要思考什么呢(1)建设网站的目的是什么首先 ...

  4. java设计模式—多工厂模式

    概念           多个工厂模式,是对普通工厂方法的改进,在普通工厂模式中,如果字符串传递出错,则不能正   确创建对象,而多个工厂模式是提供多个工厂方法,分别创建对象.     多个工厂模式关 ...

  5. setTimeout和setInterval和单线程

    我们知道,js是单线程执行的(单线程j就是说在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行).所以其实setTimeout和setInterval所谓的"异 ...

  6. LDA数学八卦笔记(一)Gamma函数

    Technorati Tags: LDA主题模型

  7. Go语言核心之美-必读

    Go语言核心之美开篇了!.不管你是新手还是一代高人,在这个系列文章中.总能找到你想要的! 博主是计算机领域资深专家并且是英语专8水平,翻译标准仅仅有三个:精确.专业.不晦涩,为此每篇文章可能都要耗费数 ...

  8. 假设不小心改动了系统SDK文件,编译无法通过改怎么办?(iOS开发)

     project报例如以下错误: fatal error: file '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimul ...

  9. Springboot 之 解决IDEA读取properties配置文件的中文乱码问题

    问题描述 当在.properties的配置文件中有中文时,读取出来的总是乱码.比如我的application.properties配置文件的内容如下: server.port=9090 test.ms ...

  10. 非等高cell实战(01)-- 实现微博页面

    非等高cell实战(01)-- 实现微博页面 学习过UITableView.AutoLayout以及MVC的相关知识,接下来通过一个微博页面实战来整合一下. 首先看一下效果图: 需求分析 此页面为非等 ...