07_模板层

#模板层

一、模版语法之变量

1、变量的直接使用

使用方法:{{ 变量名 }}
# views.py
def index(request):
    name = 'lqz'
    age = 18
    ll = [1, 2, 'lqz', 'egon']
    ll2=[]
    dic2={}
    tu = (1, 2, 3)
    dic = {'name': 'lqz', 'age': 18, 'll': [1, 2, 4]}
index.html:

模板语言之变量

字符串:{{ name }}

数字:{{ age }}

列表:{{ ll }}

元祖:{{ tu }}

字典:{{ dic }}

2、函数及类的使用:

# views.py
def index(request):
    # 函数
    def test():
        print('lqz')
        return 'zhouxiang dsb'
    # 类
     class Person():
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def get_name(self):
            return self.name
        @classmethod
        def cls_test(cls):
            return 'cls'
        @staticmethod
        def static_test():
            return 'static'
        # 模板里不支持带参数
        def get_name_cs(self,ttt):
            return self.name
    lqz=Person('lqz',18)
    egon=Person('egon',18)
    person_list=[lqz,egon]
    person_dic={'lqz':lqz}
index.html:
{# 只写函数名:相当于函数名(),执行该函数 #}

函数:{{ test }}

{# 对象内存地址 #}

对象:{{ lqz }}

列表套对象:{{ person_list }}

字典套对象:{{ person_dic }}

3、深度查询:

index.html:

深度查询

列表第0个值:{{ ll.0 }}

列表第3个值:{{ ll.3 }}

字典取值:{{ dic.name }}

字典取列表值:{{ dic.ll }}

{# 再继续取值,继续点 #}

对象取数据属性:{{ lqz.name }}

对象取绑定给对象的函数属性:{{ lqz.get_name }}

对象取绑定给类的函数属性:{{ lqz.cls_test }}

对象取静态方法:{{ lqz.static_test }}

把对象列表中egon年龄取出来:{{ person_list.1.age }}

{# 拓展:不能调有参数的方法 #} {# 注意:句点符也可以用来引用对象的方法(无参数方法) #}

字符串的方法:{{ name.upper }}

二、模板之过滤器

语法:{{第一个参数|过滤器名字:第二个参数}}
{{obj|filter__name:param}}  变量名字|过滤器名称:变量
常见过滤器:

default:(默认值)

# 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
{{ value|default:"nothing" }}

length:(长度)

# 返回值的长度。它对字符串和列表都起作用。例如:
{{ value|length }}
# ps:value = ['a', 'b', 'c', 'd'] ,那么输出是 4

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: 参数 3 以上

# 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
# 参数:要截断的字符数,例如:
{{ value|truncatechars:5 }}

safe:

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

你好

'

过滤器之不用safe:{{ h1 }}

过滤器之用safe:{{ h1|safe }}

其它过滤器(了解)
过滤器_01.jpg
过滤器_02.jpg
过滤器_03.jpg
过滤器_04.jpg

三、模版之标签

语法:{% 标签 %}

for标签

forloop:对象(里面有好多东西:parentloop,last,first,counter....)忘记的话,自己打印一下
empty:被循环的对象是空,才走它
for循环可以嵌套,也可以用if
# 遍历每一个元素:
{% for person in person_list %}
    

{{ person.name }}

{% endfor %}
# for ... empty
{% for person in person_list %}
    

{{ person.name }}

{% empty %}

sorry,no person here

{% endfor %}

if 标签

{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

{% if num > 100 or num < 0 %}
    

无效

{% elif num > 80 and num < 100 %}

优秀

{% else %}

凑活吧

{% endif %}
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

with :重命名,应用在变量名过长

四、自定义标签和过滤器

标签不能用在if判断,过滤器,可以用在if判断

自定义过滤器

-1 先app是不是已经在setting中注册
-2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块)
-3 在模块下创建一个py文件,名字随意:mytag.py
-4 # 第一步,导入template
    from django.template import Library
    # 第二步,定义一个叫register的变量=template.Library()
    register = Library()
-5 写一个函数,用@register.filter(name='yyy')装饰一下(可以指定别名)
    def str_add(str1, str2): #一定要有返回值
        # 业务逻辑很复杂
        return str1 + str2
-6 在模板里:(新定定义的标签,过滤器,都要重启程序)
        -{% load mytag %}
        -{{'lqz'|str_add:'nb'}}

自定义标签

-1-4:前4步,根过滤器的定义完全一样
-5 只是装饰器不一样
    @register.simple_tag()
    def add_nb(value):
        return value+'nb'
-6 在模板里:(多个参数,以空格区分)
    -{% load mytag %}
    -{% add_nb 'lqz'%}

你可能感兴趣的:(07_模板层)