关于django的模板层

你可能已经注意到我们在例子视图中返回文本的方式有点特别。 也就是说,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)来实现这种模式,这就是本章要具体讨论的问题。

复制代码
 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]}
复制代码
{{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,"di  c":dic,"date":date,"person_list":person_list})
复制代码

  template文件夹中的某个网页,存有我们的视图函数所要调用的玩网页

复制代码
<h4>{{s}}</h4>          #花括号里面的名字是和视图函数中返回值中的字典中的键值对应的
<h4>列表:{{ l.0 }}</h4>   #花括号中的0是指定取l列表中的第一个值
<h4>列表:{{ l.2 }}</h4>       #花括号中的2是取l中的第三个数嵌入页面中
<h4>字典:{{ dic.name }}</h4>    #取视图函数中视图函数定义的字典中的键值为name锁对应的值
<h4>日期:{{ date.year }}</h4>    #取相应视图函数中data中year的值
<h4>类对象列表:{{ person_list.0.name }}</h4>          ##取相应的列表中的第一个值的名字

注意:句点符也可以用来引用对象的方法(无参数方法):

<h4>字典:{{ dic.name.upper }}</h4>

复制代码

模板值过滤器

复制代码
语法:

{{object|filter_name:参数}}

#boject为要引用的对象(变量)
#filter_name为过滤器的名字
#param为参数

复制代码

  default

如果一个变量的值为false或者为空,则使用默认值,否则使用变量值

{{param|default:'nothing'}}

  length

返回值的长度:他对字符串和列表都适用
{{param|length}}

如:param是['a','b','c','d']则返回值是4;
param是'abcd'返回值也是4

  

  filesizeformat

把文件的大小转化成我们可读的一个尺寸形式:如'1KB','20MB','100bytes'

{{param|filesizeformat}}

如:102400009 则返回值为 1MB(近似等于不是精准的)

  date

如:
param=datetime.datetime.now()

{{param|date:'Y-m-d'}} #从param中筛选出年月日


  slice

切片:
如param='qwert'
{{param|silce:'2:-1'}} #返回值是'ert'

  

  truncatechar

复制代码
如果字符串中字符数量多于指定数量,则截取指定数量的字符串显示,并用三个...来代替被截断的字符

{{param|truncatechar:参数}}   #参数为你想要截取的长度(包括三个点)

param='派生从入门到入土'
{{param|truncatechar:'6'}} #返回值为:派生从...
#注意,这边...三个点点点要占用三个字符

复制代码

  safe

复制代码
  Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个
内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签
的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
比如:
  value='<p>我是p标签<P>'
{{value|safe}} #告诉django这是一个安全的标签,要转化成标签,如果没用safe这个过滤器
               #则是一个字符串

复制代码

  这些是一些基本的过滤器.

模板之标签

你可能已经注意到我们在例子视图中返回文本的方式有点特别。 也就是说,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)来实现这种模式,这就是本章要具体讨论的问题。

复制代码
 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]}
复制代码

猜你喜欢

转载自www.cnblogs.com/tjp40922/p/10200886.html
今日推荐