zoukankan      html  css  js  c++  java
  • django -- 模版语言之过滤器Filters和for循环

    前戏

    在前面写的图书管理系统中,我们对模版语言应该已经不陌生了,使用{{ }}包裹起来的就是模版语言,只需要记住两种就可以了

    {{ 变量名 }}            变量相关的

    {% %}                 逻辑相关的 

    变量

    如果使用的变量不存在,模版系统将插入string_if_invalid选项的值,它被默认设置为“”(空字符串)

    看几个栗子

    例子1:

    def index(request):
        name = '邹邹'
        dic = {
            "name": "老王",
            "age": 18,
            "items": "test"
        }
        return render(request, "index1.html", {"n1": name, "d1": dic})
    <p>{{ n1 }}</p>         <!-- 取变量的值 -->    邹邹
    <p>{{ d1.age }}</p>     <!-- 取字典里key对应的值 -->  18
    <p>{{ d1.items }}</p>   <!-- 取字典里items的值,如果字典没有items这个key,则用字典的item方法 -->   test   没有则为:dict_items([('name', '老王'), ('age', 18)])

    例子2:

    def index(request):
        lis = ["where", "what", "why"]
    
        class Person(object):
            def __init__(self, name, age, dream):
                self.name = name
                self.age = age
                self.dream = dream
    
            def dream(self):
                return "少年不努力,长大搞IT"
    
        p1 = Person('邹邹', 18, 'money')
    
        return render(request, "index1.html", {"name": lis, "p": p1})
    <p>{{ name.1 }}</p>   <!-- 取列表里索引为1的值 -->  what
    <p>{{ p.age }}</p>    <!-- 取类里的属性 -->   18
    <p>{{ p.dream }}</p>    <!-- 先取类里的属性,如果不存在执行dream方法 -->  money    不存在----少年不努力,长大搞IT  

    总结:

    点(.)在模版中有特殊的含义,当遇到点时,它将以下面的顺序查询

    1.字典查询

    2.属性或方法查询(先根据属性查,查询不到在查询对应的方法)

    3.数字索引查询

    Filters(过滤器)

    在Django中,可以使用过滤器来改变变量的显示

    语法:{{value|filter_name:参数}}     使用管道符“|”来表示过滤器

    说明:

    1.过滤器支持链式操作,既一个过滤器的输出可以作为另一个过滤器的输入

    2.管道符“|”和冒号“:”左右不能有空格

    3.过滤器参数包含空格的话,必须用引号包裹起来

    default

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

    <p>{{ name|default:"你好" }}</p>   
    add

    作用:如果是int型,则将参数相加,如果是字符串,则拼接

    name = 123
    
    <p>{{ name|add:"5"}}</p>

    结果:

    128

    字符串拼接

    name = "aaa"
    
    <p>{{ name|add:"5"}}</p>

    结果:

    aaa5
    addslashes

    作用:在value中的引号前增加反斜线“”

    name = 'abc"rwer"dd'
    <p>{{ name|addslashes}}</p>

    结果:

    abc"rwer"dd
    capfirst

    作用:将value中的第一个字符串转化成大写

    name = 'abc'
    <p>{{ name|capfirst}}</p>

    结果:

    Abc
    lower

    作用:将一个字符串转为小写形式

    name = 'ABC'
    <p>{{ name|lower}}</p>

    结果:

    abc
    upper

    作用:将一个字符串转为大写形式

    name = 'abc'
    
    <p>{{ name|upper}}</p>

    结果:

    ABC
    length

    说明:返回值的长度,作用于字符串和列表

    语法:{{value|length}}

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

    如name = "abcd",则显示为4 

    filesizeformat

    将一个数字转为一个大小

    语法

    {{value|filesizeformat}}

    如value=123456,结果为120.6 KB。value=123456789,结果为117.7 MB

    slice

    作用:切片

    name = '123456789'

    <p>{{ name|slice:"2:6"}}</p>

    结果:3456

    date

    作用:格式化显示时间

    {{ value|date:"Y-m-d H:i:s"}} 
    safe

    Django模版中写一段HTML代码,会默认转义,在页面上也显示的是HTML代码

    例如:

    name = '<p>我是vip</p>'
    <p>{{ name}}</p>

    结果:

    <p>我是vip</p>

    但是我们只想让它显示:我是vip,这时候就要用safe了

    <p>{{ name|safe}}</p>
    truncatechars

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

    参数:截断的字符数

    name = 'abcdefghijklmn'
    <p>{{ name|truncatechars:7}}</p>

    结果:

    abcd...
    cut

    作用:删除指定的字符串

    name = 'abcdefghajklma'
    <p>{{ name|cut:'a'}}</p>

    结果:把字符串a都删掉了

    bcdefghjklm
    join

     字符串连接,和python中的join一样

    lis = ['邹邹', '马云', '麻花藤']
    <p>{{ name|join:"-"}}</p>

    结果:

    邹邹-马云-麻花藤

    自定义filter

    虽然Django给我们提供了很多的过滤器方法,但往往还是不能满足我们的项目开发,这时候我们就需要自定义filter了,自定义filter函数就是python中的函数

    在app中先创建一个templatetags的包,必须是这个名,然后再包下建一个py文件,名称随便起

     在add_str.py里就可以写自定义的filter函数了

    from django import template
    
    register = template.Library()  # 固定写法,生成一个注册实例对象
    
    
    @register.filter()  # 告诉Django的模版语言我现在注册一个自定义的filter
    def add_hello(value):
        '''
        :param value:  | 左边被修饰的那个变量
        :return:
        '''
        return value + "hello"
    
    
    @register.filter()  
    def add_str(value, arg):
        # value  左边被修饰的变量
        return value + arg

    说明:@register.filter()里也可以写name=“xxx”,@register.filter(name="hello"),如果这样写了之后,在HTML文件里就不能使用函数名来当过滤器了,要使用你定义的这个名称

    在html里引用和之前的过滤器用法一样,唯一不同的是要在引用之前写{% load 文件名 %}

    name = 'abc'
    {% load add_str %}
    <p>{{ name|add_hello}}</p>

    <p>{{ name|add_str:"good"}}</p>

    结果:

    abchello
    
    abcgood

    注意:如果报错,要重启django项目,因为templatetags是我们新建的包

    for

    语法:

    {% for i in data %}
      
      <td>{{ i.name }}</td>              
                
    {% endfor %}

    常用的for循环

    forloop.counter

    当前索引的索引值,从1开始
    forloop.counter0 当前索引的索引值,从0开始
    forloop.revcounter 当前循环的倒序索引值(到1结束)
    forloop.revcounter0 当前循环的倒序索引值(到0结束)
    forloop.first 当前循环是不是第一次循环(布尔值)
    forloop.last 当前循环是不是最后一次循环(布尔值)
    forloop.parentloop 本层循环的外层循环
    for...empty
    {% for i in data %}
      
    <td>{{ i.name }}</td>
    {% empty %}
      
    <td>空空如也</td>
    {% endfor %}
    if...elif...else
    {% if user_list %}

      {{ user_list|length }}
    {% elif black_list %}
      {{ black_list|length }
    {% else %}
      没有用户
    {% endif %}

    if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断

    with
    {% with business.employees.count as f %}
      {{ f.name }} 
    {% endwith %}

    相当与给 with business.employees.count 起了个别名f

  • 相关阅读:
    兼容性问题
    【浏览器渲染原理】 渲染树和页面渲染
    leetcode153. 寻找旋转排序数组中的最小值
    leetcode162. 寻找峰值
    各种常量池
    leetcode137. 只出现一次的数字 II
    leetcode136. 只出现一次的数字
    leetcode133. 克隆图
    ClassLoader分类
    overload和override
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/11173428.html
Copyright © 2011-2022 走看看