Django之模板层

Posted Sober--

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之模板层相关的知识,希望对你有一定的参考价值。

前面学习了Django的下载和基础的操作,掌握了其基本框架,接下来我们来学习Django中的模板语法。

学习任务:知道什么是模板,以及html+模板语法的具体用法

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

模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的标签。

#原始的视图
def timeHandle(request):

    import datetime

    t=datetime.datetime.now()

#Django修改后的视图

    # 方式1:
    # return HttpResponse("<h1>%s</h1>"%str(t)[:19])

    # 方式2:
    from django.template import Template, Context
    templateobj=Template("<h2 style=‘color:red‘>current time:{{time}}</h2>")
    contextobj=Context({"time":str(t)})
    html=templateobj.render(contextobj)
    return HttpResponse(html)

    #方式3
#     return render(request,"time.html",{"time":str(t)[:19]})

 模板语法之变量

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

具体实例如下:

views:

def index(request):
    name=I am dreaming  #字符串
    i=100
    l=[111,222,333]    #列表
    dic={name:yuan,age:18}  #字典

    class Anminal(object):
        def __init__(self, name, color):
            self.name = name
            self.color = color

        def __str__(self):
            return self.name + str(self.color)

        def run(self):
            return is running

    Anminal_dog1 = Anminal(拉布拉多1, 黑色)
    Anminal_dog2 = Anminal(拉布拉多2, 黑色)
    Anminal_dog3 = Anminal(拉布拉多3, 黑色)

    AnminalList = [Anminal_dog1, Anminal_dog2, Anminal_dog3]
    msg=[]    #空列表 
   
    label = "<a href=‘‘>点击</a>"

    return render(request,index.html,locals())  
    # return render(request,‘index.html‘,{‘name‘:name,‘i‘:i,‘l‘:l,‘dic‘:dic,‘Anminal_dog1‘:Anminal_dog1,‘Anminal_dog2‘:Anminal_dog2,‘Anminal_dog3‘:Anminal_dog3,‘AnminalList‘:AnminalList})

templates:

<p>{{ name }}</p>
<p>{{ name| length }}</p>
<p>{{ name|slice:5: }}</p>
<p>{{ i }}</p>
<p>{{ l }}</p>
<p>{{ l|length }}</p>
<p>{{ dic}}</p>
<p>{{ Anminal_dog1.name}}</p>
<p>{{ Anminal_dog1.color}}</p>
<p>{{ Anminal_dog3.run }}</p>
<p>{{ AnminalList }}</p>
<hr>
{% for foo in AnminalList reversed%}
<p>{{ foo }}</p>
{% endfor %}
<hr>
{{ msg|default:"" }}
<p>--------->{{ content|truncatechars:20 }}</p>
<p>{{ content|truncatewords:5 }}</p>

模板之过滤器

语法:{{obj|filter__name:param}}

default

如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:

{{ value|default:"nothing" }}	

length

返回值的长度。它对字符串和列表都起作用。例如:

{{ value|length }}

filesizeformat

将值格式化为一个 “人类可读的” 文件尺寸 (例如 ‘13 KB‘‘4.1 MB‘‘102 bytes‘, 等等)。例如:

{{ value|filesizeformat }}

如果 value 是 123456789,输出将会是 117.7 MB。  

date

如果value=datetime.datetime.now()

{{ value|date:"Y-m-d" }}  

slice

如果 value="hello world"

{{ value|slice:"2:-1" }}

truncatechars

如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

参数:要截断的字符数

例如:

	
{{ value|truncatechars:9 }}

如果value“Joel 是 >,输出将为“Joel i ...”

safe

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

value="<a href="">点击</a>"
	
{{ value|safe}}

模板之标签

标签看起来像是这样的: {% tag %}。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。

一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})。

for标签

遍历每一个元素:

{% for person in person_list %}
    <p>{{ person.name }}</p>
{% endfor %}

可以利用{% for obj in list reversed %}反向完成循环。

遍历一个字典:

{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}

自定义模板和过滤器 

具体步骤如下:

(1)在settings中的INSTALLED_APPS,是否有当前应用。

(2)在应用中创建一个templatetags

(3)在templatetags中创建py文件:mytag.py 

(4)在mytag.py 中引入:

     from django import template
     from django.utils.safestring import mark_safe

     register = template.Library() #register的名字是固定的,不可改变

(5)定义过滤器和标签
         @register.filter
          def multi(x,y):
          return x*y


        @register.simple_tag
          def multiTag(x,y,z):
         return x*y*z

 (6)在引用模板中导入:{% load myTag %}

  (7) 调用:
            过滤器: {{var|filter_name:参数}} # 参数只能是一个

            标签: {% simple_tag 参数1 参数2 ... %}

 模板继承

 

 

 

 

 

 

以上是关于Django之模板层的主要内容,如果未能解决你的问题,请参考以下文章

Django之模板层

Django--模板层

DJANGO入门系列之(模板层)

Django之模板层

Django基础之视图(views)层模板层

[Django框架之模板层]