首页 > 技术文章 > 过滤器和标签

zhouhai007 2019-01-10 21:56 原文

1 模版简介

                   DTL:django模板语言

                   核心:

                            变量 {{ }}

                            标签 {% %}

                  

         2 模版语法之变量

                   -变量渲染:{{变量}}

                   -变量深度查询:{{变量.索引/key值/方法}}

 

def index(request):

    age=18

    name='lqzzzzzzzzzzzzzzz'

    name2='lqz is very big'

    dic={'name':'lqz','age':18,'hobby':['play','game']}

    ll=['lqz',18,'ppp',123]

    ll3=[[1,5,3],[6,9]]

    ll2=[]

    href='<a href="http://www.baidu.com">点我看美女</a>'

    href2=mark_safe(href)

    ctime=datetime.datetime.now()

    file_size=102453425342345234523

    bol=True

    # locals()  代表把当前函数中的所有局部变量,传到模板中

    class Person():

        def __init__(self,name):

            self.name=name

        def test(self):

            return self.name

        def __str__(self):

            return self.name

        @classmethod

        def test2(cls):

            return '123'

    lqz=Person('lqz')

    # 在模板上写变量的时候,相当于执行了print方法,如果是方法,不能加括号,它会自动加括号,但是不支持传参数

    print(lqz)

    print(lqz.test())

    return render(request,'index.html',locals())

         3 模版之过滤器

                   变量之过滤器(是个函数)

                   -语法:(后面只能传一个参数)

                            {{变量名|过滤器的名字:参数}}

                   -内置过滤器:

                        数字+3:

                            <p>{{ age|add:3 }}</p>

                            name的长度:

                            <p>{{ name|length }}</p>

                            bol有值取值没有默认为123

                            <p>{{ bol|default:'123' }}</p>

                            <p>{{ ll2|default:'我是空的' }}</p>

                            对文件大小的转换格式

                            <p>{{ file_size|filesizeformat }}</p>

                            时间:

                            <p>{{ ctime }}</p>

                            <p>{{ ctime|date:'Y年m月' }}</p>

                            从索引2到4切出来

                            <p>{{ name|slice:'2:4' }}</p>

                            从开头切出6个字符后面三个是...

                            <p>{{ name|truncatechars:6 }}</p>

                            切出2个词语后跟...

                            <p>{{ name2|truncatewords:2}}</p>

                  

                   '        可以点击跳转

                            <p>{{ href|safe }}</p>

                            views中的代码: href='<a href="http://www.baidu.com">打开百度</a>

                                                       

         4 模版之标签

                   -语法:{% %}

                   -foo是一个可迭代对象

                       {% for a in foo %}

 

                            {% endfor %}

                   -forloop:counter,couter0,revcounter,revcouter0,first,last,parentloop:父循环的forloop对象

                   -for--empty的使用

                            {% for foo in ll2 %}

                                     {{ foo }}

                            {% empty %}

                                     没有值啊

                            {% endfor %}

                   -if判断

                            {% if ll2 %}

                                     ll2 有值

                            {% elif ll %}

                                     ll有值

                            {% else %}

                                     ll2 没有值

                            {% endif %}

                   -with重命名

                            {% with dic.hobby.1 as a %}

                            {#{% with a=dic.hobby.1 %}#}

                                     {{ a }}

                                     <p>aaaa</p>

                                     {{ a }}

 

                            {% endwith %}

                           

         5 自定义过滤器

                   1 确认app是否在settings中注册

                   2 在app下创建templatetags的模块(名字固定)

                   3 在模块下创建py文件(名字随意)--->在模板中{% load py文件名字%}

                   4 在py文件中写过滤器

                            from django.template import Library

                            register = Library()

                            #指定了name之后,模板上使用的时候,直接用name调用,如果没指定name,就用函数的名字

                            # 过滤器最多有两个参数

                            @register.filter(name='myadd')

                            def my_add(a,b):

                                     print(a+b)

                                     return a+b

                   5 模板中使用

                            -1 {% load py文件名字%}

                            -2 {{ 变量|myadd:1}}

         6 自定义标签

                   1 确认app是否在settings中注册

                   2 在app下创建templatetags的模块(名字固定)

                   3 在模块下创建py文件(名字随意)--->在模板中{% load py文件名字%}

                   4 在py文件中写过滤器

                            from django.template import Library

                            register = Library()

                            #指定了name之后,模板上使用的时候,直接用name调用,如果没指定name,就用函数的名字

                            # 过滤器最多有两个参数

                            @register.simple_tag(name='mytag')

                            def my_tag(a,b,c):

                                     return a+b+c

                   5 模板中使用

                            -1 {% load py文件名字%}

                            -2 {% mytag 参数1 参数2 参数3%}

         7 标签和过滤器的区别:

                   1 标签可以传多个参数,过滤器最多只能传2个

                   2 使用过滤器{{ }}   标签使用:{% %}

                   3 ****重点:过滤器可以放在if判断后,标签不能放在if判断后

                  

 

推荐阅读