Django模板——自定义过滤器

文章目录

  • Django模板——自定义过滤器
    • 1代码布局
      • 1.1 app特有模板标签
      • 1.2 可复用标签
    • 2定义过滤器
      • 2.1模板过滤器的本质
    • 3注册过滤器
    • 4使用
    • 5.期望字符串的模板过滤器

Django模板——自定义过滤器

1代码布局

1.1 app特有模板标签

  1. app目录下创建名为templatetags的包
  2. templatetags目录下创建python模块(通常只需创建.py文件)

1.2 可复用标签

  1. 专门创建一个做模板标签的app
  2. 在settings.py中注册app(INSTALL_APPS)

2定义过滤器

2.1模板过滤器的本质

#模板过滤器的本质是方法,带有一到两个参数。
#定义过滤器就是书写一个方法
def func(parm1, parm2):
    pass
  • parm1:传递进来的模板变量
  • parm2:普通参数,可以带默认值

3注册过滤器

#project/templatetags/customer_filters.py
#通过django.template.Library 的实例的 filter 方法
from django.template import Library

register = Library()   #创建Library对象实例

def showGender(self, language='zh'):  #定义过滤器函数
    map = {
        'zh': ('女', '男', '*'),
        'en': ('female', 'male', '*')
    }
    gender = '-'
    try:
        gender = map.get(language, map['zh'])[self]
    except:
        pass

    return gender
'''
方法filter有两个参数
- name:过滤器名称,字符串类型,默认是函数名
- filter_func:定义的过滤器函数
'''
#注册方法1,filter函数
register.filter(showGender)   

#注册方法二,装饰器
@register.filter(name='showGender')
def showGender(self, language='zh'):
    pass  
    #函数内容同上

4使用



{% load templatetags %}
{{ stu.name|showGender }}

5.期望字符串的模板过滤器

如果您正在编写仅希望将字符串作为第一个参数的模板过滤器,则应使用装饰器stringfilter。这将在传递给您的函数之前将对象转换为其字符串值:

from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
@stringfilter
def lower(value):
    return value.lower()

这样,你就可以将一个整数传递给这个过滤器,它不会导致AttributeError(因为整数没有lower() 方法)。

你可能感兴趣的:(Django,django,模板,过滤器,自定义)