Django学习日记04_模板_overview
通过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的更多相关文章
- Django学习日记05_模板_模板语言
Variables 在模板中,使用两个大括号包含变量的方式来使用变量: {{ name }} 该变量应该作为键值对中的键,在Context中能被查找到. Tags 模板中使用Tags来进行简单的逻辑: ...
- Django学习笔记之模板
模板 模板介绍 在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面. 目前市面上有非常多的模板系 ...
- Django学习日记06_视图_URLconf、View
URLconf Django通过URLconf来响应网页请求,在项目设置settings.py中,设定了ROOT_URLCONF值来指定默认的URLconf(即mysite.urls),当HTTPRe ...
- Django学习日记02_项目环境
创建一个工程: django-admin.py startproject mySite 将会产生以下文件: mySite/ manage.py mySite/ __init_ ...
- Django学习总结之模板templates
- django模板: templates - 模板分为两个过程: 1, 加载 : loader.get_template('xxx.html') 返回值是一个template对象 2, 渲染 : t ...
- Django学习笔记之模板渲染、模板语言、simple_tag、母版子版、静态配置文件
一.首先我们用PyCharm来创建一个Django项目 终端命令:django-admin startproject sitename 图形创建: 这样一个Django项目就创建完成了,上面可以看 ...
- Django学习之 - 基础模板语言
模板语言if/else/endif {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% else %} &l ...
- Django学习系列之模板系统
一.模板标签 if/else {% if %}标签检查一个变量的值是否为真或者等于另外一个值,如果为真,系统会执行{% if %}和{% endif %}之间的代码块,例如: {% if ...
- Django学习系列之模板
什么是django模板 模板是一个文本,用于分离文档的表现形式和内容,模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签) 模板通常用于产生HTML 如何使用模板 创建一个Tem ...
随机推荐
- XSS攻击原理及防御措施
概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系 ...
- php IP转换整形(ip2long)
如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如 <?php echo ip2long("10.2.1.3"); ?> ...
- 前端chrome浏览器调试
引言 "工欲善其事,必先利其器" 恩,这句话我觉得说的特别有道理,举个例子来说吧,厉害的化妆师都有一套非常专业的刷子,散粉刷负责定妆,眼影刷负责打眼影,各司其职,有了专业的工具才能 ...
- 来个Button看一看
0.目录 1.前言 2.基本属性与方法 3.点点更健康 4.我的Button有点多 5.震惊!TextView竟然... 1.前言 每次写代码总会忘记一些东西,又要重新Goooooooooogle,好 ...
- C#的数据类型总结(1)
C# 是一种强类型语言.在变量中存储值之前,必须指定变量的类型,如以下示例所示: int a = 1; string s = "Hello"; XmlDocument tempDo ...
- Oracle查看对象空间使用情况show_space
tom大神写了一个用于查看Oracle数据库对象空间使用情况. 以下演示一下怎样使用: –工具源代码 CREATE OR REPLACE PROCEDURE show_space(p_segname ...
- C语言之——文件操作模式
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47450667 "rt" 仅仅读打开一个文本文件.仅仅同意读数据 ...
- POJ 2533 Longest Ordered Subsequence(DP 最长上升子序列)
Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 38980 Acc ...
- Android 获取手机信息
private void initData() { TelephonyManager mTm = (TelephonyManager) getActivity().getSystemService(C ...
- 【Sqlsever系列】日期和时间
1 概述 本文将集合MSDN简要概述Sqlserver中日期和时间函数. 2 具体内容 2.1 date and time data types 2.2 日期和时间功能 3 参考文献 ...