django模板引擎

我们可以把html和js代码写入django的视图函数中,以字符串的格式传入HttpResponse()对象中,然后通过服务器返回给前端。也就是说,我们可以把html以字符串的形式写入python业务函数之中。
那么这会产生一个很大的问题,如果前端如果想要改动前端代码,就需要改动python代码,这不利于项目的开发和维护。

如何使用模板系统

想要在 Python 代码中使用模板系统,只需遵循下面两个步骤:

  1. 可以用原始的模板代码字符串创建一个 Template 对象, Django 同样支持用指定模
    板文件路径的方式来创建 Template 对象(需要选中一个模板引擎,然后通过html文件的路径来加载代码);

  2. 调用 Template 对象的 render() 方法(注意,这不是django的那个render()方法)给它传入一个context(上下文). 它将返回一个
    完整的模板字符串内容,包含了所有标签块与变量解析后的内容。

创建模板对象

创建一个 Template 对象最简单的方法就是直接实例化它。 Template 类就在django.template 模块中,构造函数接受一个参数,原始模板代码。

 Template("My name is {{ name }}.")

一旦建立个Template对象
也可以用 context 来传递数据给Template()中的“{{}}”里的变量,。 一个 context 是一系列变量和它们值的集合(可以理解为字典的形式)。

>>> from django.template import Context, Template
>>> t = Template("My name is {{ name }}.")
>>> c = Context({"name": "Stephane"})
>>> t.render(c)
'My name is Stephane.'

比如模板使用它来赋值模板变量标签和 执行块标签。
context 在 Django 里表现为 Context 类,在 django.template 模块里。 它构造是有一个
可选参数:一个字典映射变量和它们的值。调用 Template 对象 的 render() 方法并传递context 来填充模板,render()返回类型为“<class ‘django.utils.safestring.SafeText’>”,此时模板和context上下文已经渲染完毕,可以通过HttpResponse对象,返回给浏览器:

from django.template import Context, Template
        t = Template("My name is {{ name }},我在{{address}}读书.")
        c = Context({"name": "Stephane", "address": "清华大学"})
        safe_text = t.render(c)
        return HttpResponse(safe_text)

结果为:My name is Stephane,我在清华大学读书.
事实上,通过上下文匹配模板两个大括号中的变量的大部分的解析工作都是在后台通过对简短正则表达式一次性调用
来完成

其他语法,如过滤,注释等语法皆略。。。

在视图中使用模板

方式1–使用html标签

from django.http import HttpResponse
import datetime
def current_datetime(request):
 now = datetime.datetime.now()
 html = "<html><body>It is now %s.</body></html>" % now
 return HttpResp

模板依燃内嵌在 Python 代码之中,未解决问题。

方式2–通过open函数,找到html文件读出来后,再返回给浏览器

from django.template import Template, Context
from django.http import HttpResponse
import datetime
def current_datetime(request):
 now = datetime.datetime.now()
 # Simple way of using templates from the filesystem.

 # This doesn't account for missing files!
 fp = open('/home/djangouser/templates/mytemplate.html')
 t = Template(fp.read())
 fp.close()
 html = t.render(Context({'current_date': now}))
 return HttpResponse(html)
  • 它没有对文件丢失的情况做出处理。如果文件 mytemplate.html 不存在或者不可读,open() 函数调用将会引发 IOError 异常
  • 这里对模板文件的位置进行了硬编码。如果你在每个视图函数都用该技术,就要不断复制这些模板的位置。更不用说还要带来大量的输入工作!
  • 它包含了大量令人生厌的重复代码。与其在每次加载模板时都调用 open() 、p.read() 和 fp.close() ,还不如做出更佳选择。

方式3–使用 模板加载 和 模板目录

为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中动态加载模板,
要使用此模板加载 API,首先你必须将模板的保存位置告诉框架
。该项工作在 设置文件 中完成:
在这里插入图片描述
Base_DIR是django项目的动态路径
在这里插入图片描述
完成 TEMPLATE_DIRS 设置后,下一步就是修改视图代码,让它使用 Django 模板加载功能而
不是对模板路径硬编码。返回 current_datetime 视图,进行如下修改:
在这里插入图片描述
此范例中,我们使用了函数 django.template.loader.get_template() ,而不是手动从文件
系统加载模板。(任何通过手动方式拼接而成的url都是硬编码url,是Django建议避免的)。该 get_template() 函数以模板名称为参数,在文件系统中找出模块的位置,打开文件并返回一个编译好的 Template 对象。如果 get_template() 找不到给定名称的模板,将会引发一个 TemplateDoesNotExist 异常。
在这里插入图片描述

正如你从图中的错误信息中所看到,Django 尝试通过组合 TEMPLATE_DIRS 设置以及传递给 get_template() 的模板名称来查找模板。因此如果 TEMPLATE_DIRS 为’/home/django/templates’ ,Django 将会 查找’/home/django/templates/current_datetime.html’ 。如果 TEMPLATE_DIRS 包含多个目录,它将会查找每个目录直至找到模板或找遍所有目录
接下来,在模板目录中创建包括以下模板代码 current_datetime.html 文件:

It is now {{ current_date }}. 在网页浏览器中刷新该页,你将会看到完整解析后的页面。

get_template()中使用子目录

把所有的模板都存放在一个目录下可能会让事情变得难以掌控。你可能会考虑把模板存放在
你模板目录的子目录中,这非常好。事实上,我们推荐这样做;一些 Django 的高级特性(例
如将在第九章讲到的通用视图系统)的缺省约定就是期望使用这种模板布局。
把模板存放于模板目录的子目录中是件很轻松的事情。只需在调用 get_template() 时,把
子目录名和一条斜杠添加到模板名称之前,如:

t = get_template('dateapp/current_datetime.html')

由于 render() 只是对 get_template() 的简单封装, 你可以对
render() 的第一个参数做相同处理。
对子目录树的深度没有限制,你想要多少层都可以。

注意
Windows 用户必须使用斜杠而不是反斜杠。 get_template() 假定的是 Unix (linxu)风格的文件名符号约定。

参考:创建简易地模板引擎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值