在例子视图中返回文本的方式有点特别,即HTML被直接硬编码在Python代码之中。

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

尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并是一个好主意。让我们来看一下为什么:

  • 对页面设计进行的任何改变都必须对Python代码进行相应的修改。站点设计的修改往往比底层Python代码的修改要频繁得多,因此如果可以在不进行Python代码修改的情况下变更设计,将会方便很多。
  • Python代码编写和HTML设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同的部门)来完成。设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。
  • 程序员编写Python代码和设计人员制作模板两项工作过同时进行的额效率是最高的,远胜于让一个人等待另一个人完成对某个既包含Python又包含HTML的文件的编辑工作。

基于这些原因,将页面的设计和Python的代码分离开会更干净简洁更容易维护。我们可以使用Django的模板系统(Template System)来是现在这种模式,这就是本章要具体讨论的问题。

Python的模板:HTML代码 + 模板语法

def current_time(req):     # ================================原始的视图函数     # import datetime     # now=datetime.datetime.now()     # html="<html><body>现在时刻:<h1>%s.</h1></body></html>" %now      # ================================django模板修改的视图函数     # from django.template import Template,Context     # now=datetime.datetime.now()     # t=Template('<html><body>现在时刻是:<h1>{{current_date}}</h1></body></html>')     # #t=get_template('current_datetime.html')     # c=Context({'current_date':str(now)})     # html=t.render(c)     #     # return HttpResponse(html)      #另一种写法(推荐)     import datetime     now=datetime.datetime.now()     return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})

一、模板语法之变量

在Django模板中遍历复杂数据结构的关键是句点字符,语法:

{{var_name}}

views.py:

def index(request):     import datetime     s="hello"     l=[111,222,333]    # 列表     dic={"name":"yuan","age":18}  # 字典     date = datetime.date(1993, 5, 2)   # 日期对象      class Person(object):         def __init__(self,name):             self.name=name      person_yuan=Person("yuan")  # 自定义类对象     person_egon=Person("egon")     person_alex=Person("alex")      person_list=[person_yuan,person_egon,person_alex]       return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list})

template:

<h4>{{s}}</h4> <h4>列表:{{ l.0 }}</h4> <h4>列表:{{ l.2 }}</h4> <h4>字典:{{ dic.name }}</h4> <