New Document

来源:互联网 发布:vs画图软件 编辑:程序博客网 时间:2024/05/02 02:28

在视图中使用模板

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

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

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

from django.http import HttpResponseimport datetimefrom django import templatedef 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_templatefrom django.template import Contextfrom django.http import HttpResponseimport datetimedef 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_responseimport datetimedef 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()函数就直接使用一个空字典。

0 0
原创粉丝点击