• 在视图中使用模板

    在视图中使用模板

    在学习了模板系统的基础之后,现在让我们使用相关知识来创建视图。 重新打开我们在前一章在 mysite.views 中创建的 current_datetime 视图。 以下是其内容:

    1. from django.http import HttpResponse
    2. import datetime
    3. def current_datetime(request):
    4. now = datetime.datetime.now()
    5. html = "<html><body>It is now %s.</body></html>" % now
    6. return HttpResponse(html)

    让我们用 Django 模板系统来修改该视图。 第一步,你可能已经想到了要做下面这样的修改:

    1. from django.template import Template, Context
    2. from django.http import HttpResponse
    3. import datetime
    4. def current_datetime(request):
    5. now = datetime.datetime.now()
    6. t = Template("<html><body>It is now {{ current_date }}.</body></html>")
    7. html = t.render(Context({'current_date': now}))
    8. return HttpResponse(html)

    没错,它确实使用了模板系统,但是并没有解决我们在本章开头所指出的问题。 也就是说,模板仍然嵌入在Python代码里,并未真正的实现数据与表现的分离。 让我们将模板置于一个 单独的文件 中,并且让视图加载该文件来解决此问题。

    你可能首先考虑把模板保存在文件系统的某个位置并用 Python 内建的文件操作函数来读取文件内容。 假设文件保存在 /home/djangouser/templates/mytemplate.html 中的话,代码就会像下面这样:

    1. from django.template import Template, Context
    2. from django.http import HttpResponse
    3. import datetime
    4. def current_datetime(request):
    5. now = datetime.datetime.now()
    6. # Simple way of using templates from the filesystem.
    7. # This is BAD because it doesn't account for missing files!
    8. fp = open('/home/djangouser/templates/mytemplate.html')
    9. t = Template(fp.read())
    10. fp.close()
    11. html = t.render(Context({'current_date': now}))
    12. return HttpResponse(html)

    然而,基于以下几个原因,该方法还算不上简洁:

    • 它没有对文件丢失的情况做出处理。 如果文件 mytemplate.html 不存在或者不可读, open() 函数调用将会引发 IOError 异常。

    • 这里对模板文件的位置进行了硬编码。 如果你在每个视图函数都用该技术,就要不断复制这些模板的位置。 更不用说还要带来大量的输入工作!

    • 它包含了大量令人生厌的重复代码。 与其在每次加载模板时都调用 open()fp.read()fp.close() ,还不如做出更佳选择。

    为了解决这些问题,我们采用了 模板自加载模板目录 的技巧.