New Document

在视图中使用模板

重新打开mysite.views.py中的current_datetime视图

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 HttpResponse(html)

为了达到在视图中使用模板的目的,修改如下:

from django.http import HttpResponse
import datetime
from django import template

def current_datetime(request):
    t = template.Template('<html><body>It is {{time}}.'</body></html>)
    c = template.Context('time':datetim.datetime.now())
    return HttpResponse(t.render(c))

但是这个代码依然没有解决模板嵌入在Python代码中的问题,没有实现数据与表现分离。

在解决这个问题之前,我们首先了解一下:模板加载和模板目录设置

模板加载和模板目录设置

首先我们做如下操作:打开配置文件setting.py(nano setting.py),然后写入下述代码

TEMPLATE_DIRS = (
    '/home/django/mysite/templates',
)

这里我们是将/home/django/mysite/templates这个目录加到了setting.py的TEMPLATE_DIRS变量中,告诉django的模板加载机制在哪里可以找到模板。即使只有一个目录也不要忘了加逗号“,”。因为Python要求单元素元组中必须使用逗号,以示和圆括号的区别。

设置好了目录之后,我们将views.py代码修改为:

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

此范例中,我们使用了函数 django.template.loader.get_template() ,而不是手动从文件系统加载模板。该 get_template() 函数以模板名称为参数,在文件系统中找出模块的位置,打开文件并返回一个编译好的 Template 对象。

在模板目录中创建以下模板代码current_datetime.html文件:

<html><body>It is now {{current_time}}.</body></html>

在浏览器中刷新该页即可看到和之前一样的页面。

解决了模板嵌入在Python代码中的问题,我们并没有满足,现在我们来看一下位于 django.shortcuts 模块中名为 render_to_response() 的函数

render_ to _response()函数

先重新修改一下视图函数:

from django.shortcuts import render_to_response
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    return render_to_response('current_datetime.html', {'current_date'})

刷新网页也可以看到和之前一样的页面。

太棒了!我们来研究一下发生了什么事情。

  1. 我们只导入了render_to_responsedatetime
  2. 然后进行调用datetime返回一个时间给变量now。
  3. 最后调用render_to_response()函数,直接return了render_to_response()函数返回的HttpResponse对象。

问:为什么没有模板加载、上下文创建、模板解析和 HttpResponse 创建?

答:模板加载、上下文创建、模板解析和 HttpResponse 创建工作均在对 render_to_response() 的调用中完成了。

render_to_response()函数为我们提供了极大的便利,不再需要手动加载模板,创建 Context 和 HttpResponse 对象。

使用render_to_response()函数的注意事项:

  1. render_to_response()函数的第一个参数必须是要使用的模板名称。

  2. 如果要给定第二个参数,那么该参数必须是为该模板创建Context时使用的字典。如果不提供第二个参数,render_to_response()函数就直接使用一个空字典。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值