1 django 内置了许多过滤器, 例如date等,但是有些时候这些内置的过滤器无法满足我们的需求,就需要自定义一个过滤器
2 那我们如何自定义一个过滤器呢??
3 把日期中的月份变成大写
3.1 在app目录下建立templatetags/在此目录下建立空文件_init_.py和myfilter.py
3.2 .在myfilter.py编辑
from django import template
register = template.Library()
# 定义一个将日期中的月份转换为大写的过滤器,如8转换为八
@register.filter
def month_to_upper(key):
return ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'][key.month - 1]
3.3这里额外说明一下,就是注册过滤器的时候,有两种方式
第一种就是上面代码中所写的,加一个过滤器@register.filter
第二种写法就就是
register.filter('month_to_upper', month_to_upper)
# 第一个month_to_upper 就是一个别称,第二个month_to_upper就是函数
顺便粘贴一下filter的源码,就能很好的理解了
def filter(self, name=None, filter_func=None, **flags):
"""
Register a callable as a template filter. Example:
@register.filter
def lower(value):
return value.lower()
"""
if name is None and filter_func is None:
# @register.filter()
def dec(func):
return self.filter_function(func, **flags)
return dec
elif name is not None and filter_func is None:
if callable(name):
# @register.filter
return self.filter_function(name, **flags)
else:
# @register.filter('somename') or @register.filter(name='somename')
def dec(func):
return self.filter(name, func, **flags)
return dec
elif name is not None and filter_func is not None:
# register.filter('somename', somefunc)
self.filters[name] = filter_func
for attr in ('expects_localtime', 'is_safe', 'needs_autoescape'):
if attr in flags:
value = flags[attr]
# set the flag on the filter for FilterExpression.resolve
setattr(filter_func, attr, value)
# set the flag on the innermost decorated function
# for decorators that need it, e.g. stringfilter
if hasattr(filter_func, "_decorated_function"):
setattr(filter_func._decorated_function, attr, value)
filter_func._filter_name = name
return filter_func
else:
raise ValueError(
"Unsupported arguments to Library.filter: (%r, %r)" %
(name, filter_func),
)
3.4在模板中使用
{% load myfilter %}
{{ article.date_publish | month_to_upper }}
这段代码的意思就是加载这个myfilyer文件,然后在需要的地方引入自定义的过滤器,上面的第二行代码,article.date_publish其实就是month_to_upper的实参而已
自定义过滤器的步骤就是这些,不足之处欢迎批评指正,thanks!