zoukankan      html  css  js  c++  java
  • 自定义过滤器和自定义标签

    自定义标签和过滤器 需要执行的3个步骤:

    1. 在app中创建templatetags模块(必须的)

    2. 创建任意 .py 文件,如:my_tags.py

    3. 创建任意  .py文件, 例如:my_tags.py

    自定义过滤器

    举例: 增加一个乘法过滤器

    修改settings.py中的INSTALLED_APPS, 最后一行添加当前的app

    django开头的,都是一些自带的app。它内置在django源码里面

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',
    ]

    在app01目录里面新建一个templatetags目录,目录名必须是这个!!!否则django找不到

    目录里面创建my_filter_tag.py, 这个py文件名,可以随便起

    from django import template
    from django.utils.safestring import mark_safe  
    #因为django遇到html或者js标签,会转义。它认为是不安全的,所以需要在过滤器中导入make_safe模块 register
    = template.Library() #register的名字是固定的,不可改变 @register.filter #自定义过滤器 def multi_filter(v1,v2): return v1 * v2

    注意:头部的3行,是固定写法,不能改变。

    增加  @register.filter  是为了将函数转换成过滤器.  函数的名字可以随便起

    修改 views.py 里面的index函数, 内容如下

    def index(request):
        num = 100
        return render(request,'index.html',{'num':num})

    修改index.html  的body部分

    注意:在使用自定义标签和过滤器,必须在html文件中,导入之前创建的my_filter_tag

    {% load my_filter_tag %}
    <p>{{ num|multi_filter:5 }}</p>

    load表示导入模块. 

    p标签中的内容是执行了multi_filter过滤器

    注意:接收了2个参数, 一个是num, 一个是5.  因为 multi_filter 传入了2个形参,必须传入2个参数才可以.

    django项目启动时,会导入settings.py定义的模块导入,由于app01的自定义模块是启动之后加的,所以要重新启动django项目. 得到的结果是500

    自定义过滤器就是一个带有一个或两个参数的Python函数

    注意:这个Python函数的第一个参数是你要过滤的对象,第二个参数才是你自定义的参数。而且最多总共只能有两个参数,所以你只能自定义一个参数!这是过滤器的先天限制。

    • 变量的值:不一定是字符串形式。
    • 参数的值:可以有一个初始值,或者完全不要这个参数。

    例如,在{{ var|foo:"bar" }}中,foo过滤器应当传入变量var和参数"bar"。

    过滤器中的语法: {{ value|filter_name:参数 }} # 参数最多只有一个

    如果要完成3位数的乘法,过滤器可以增加一个形参,但是index.html中怎么办呢?

    只能在后端,将参数形式修改成列表,元组,字典等形式.

    例如计算 4*5*6

    修改index视图函数

    def index(request):
        num1 = 4
        num2 = 5
        num3 = 6
        num_list = [num1,num2,num3]
        return render(request,'index.html',{'num_list':num_list})

    修改my_filter_tag.py中的过滤器

    @register.filter
    def multi_filter(num_list):
        res = 1
        for i in num_list:
            res*=i
        return res

    修改index.html,修改body部分

    {% load my_filter_tag %}
    <p>{{ num_list|multi_filter }}</p>

    举例: 显示a标签

    修改my_filter_tag.py文件,增加link_tag过滤器

    @register.filter
    def link_tag(href):
        return mark_safe("<a href=%s>click</a>" % href   
    #使用make_safe方法,告诉django是安全的,不需要转义

    修改index视图

    def index(request):
        link = "http://www.py3study.com/"
        return render(request,'index.html',{'link':link})

    修改index.html

    {% load my_filter_tag %}
    <p>{{ link|link_tag }}</p>

    自定义标签

    标签, 是为了做一些功能

    举例: 4个参数的乘法运算

    修改my_filter_tag.py,  增加multi_tag函数

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

    @register.simple_tag表示将函数转换为自定义标签

    修改index.html,修改body部分

    注意:调用标签,使用{% 标签过滤器名 参数1,参数2,参数3... %}

    参数不限,但不能放在if for语句中

    {% load my_filter_tag %}
    <p>{% multi_tag 4 5 6 %}</p>

    重新启动django项目, 查看结果

    自定义标签和自定义过滤器的区别:

    1. 标签,是为了做一些功能。过滤器,是对斜杠前面的数据做过滤。

    2. 标签可以写任意个形参,而过滤器最大只能写2个形参。如果过滤器需要接收多个参数,需要将参数存放在列表,元组,字典等数据中。

    3. 过滤器可以用在if等语句后,标签不可以

  • 相关阅读:
    师弟大喜之日,送上一幅对联 求横批
    漫画:Google 走了
    产品研发流程改进
    Outlook2010 Bug 一则
    Android 手机用户版本比例
    CDMA 短信中心号码
    UIM卡 PIN 码特点
    [Accessibility] Missing contentDescription attribute on image
    java打印函数的调用堆栈
    android中解析Json
  • 原文地址:https://www.cnblogs.com/kenD/p/10067700.html
Copyright © 2011-2022 走看看