自定义过滤器
- 步骤
- 自定义的模板过滤器必须放在
app中,并且这个app必须要在INSTALLED_APPS中进行安装。 - 在这个
app下面创建一个python包叫做templatetags。这个名字是绝对的 - 在这个包下创建一个
python文件- 如果
app的名字为book,项目结构为: ```htl
- 如果
- book
- views.py
- urls.py
- models.py
- templatetags
- my_filter.py ```
- 在新建的python文件中定义过滤器
- 在新建的python文件中注册该过滤器
- 在模板中使用
load标签加载过滤器所在的python文件名
实例
先在
setting.py中的INSTALLED_APPS安装appINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',"book", # app名]
在app下新建一个名为
templatetags的python package,并且在这个包内新建一个python文件
- 在这个
python文件中定义过滤器和注册该过滤器 ```pythonmy_filter.py
from django import template
register = template.Library() # 注册library
注册方法一 使用装饰器
@register.filter
默认使用函数名作为过滤器的名字 如果不想,可以使用@register.filter(“name”)
def link_str(value, arg): # 定义过滤器 return value + arg
注册方法二
register.filter(“link_str”, link_str) # 注册过滤器
- 视图函数传递一个上下文```python# views.pydef style_filter(request):context = {"value": "jack",}return render(request, "style_filter.html", context=context)
- 模板中使用自定义的过滤器。注意需要用
load标签加载自定义过滤器的文件名。 ```html {# style_filter.html #} {% load my_filter %} {# 使用load标签加载自定义过滤器的文件名 #}
<!DOCTYPE html>
{{ value|link_str:”hello” }}
- 运行<br /><a name="00a95e48"></a>### 自定义事件计算过滤器- 获得一条信息发表的时间。该时间是距离现在多久。比如`刚刚`, `2小时前`等。可以自定义一个过滤器。- 实例- 在上面的`my_filter.py`中定义过滤器和注册过滤器```pythonfrom django import templatefrom datetime import datetimeregister = template.Library() # 注册library@register.filter()def time_since(value):minute = 60hour = minute*60day = hour*34month = day*31if not isinstance(value, datetime):return valuenow = datetime.now()# now-value是一个timedelay类型,有一个total_second()方法timestamp = (now-value).total_seconds() # 时间戳if timestamp < minute:return "刚刚"elif minute <= timestamp < hour: # 简化链式只适合andm = int(timestamp/minute) # py3除法有小数return "{}分钟前".format(m)elif hour <= timestamp < day:h = int(timestamp/hour)return "{}小时前".format(h)elif day <= timestamp < month:d = int(timestamp/day)return "{}天前".format(d)else:return value.strftime("%Y/%m/%d %H:%H")
path(‘time/‘, views.time_filter),
```python# views.pyfrom datetime import datetimedef time_filter(request):context = {"value": datetime(year=2018,month=11, day=4, hour=15, minute=0, second=0),}return render(request, "style_filter.html", context=context)
- 模板 ```html {# style_filter.html #} {% load my_filter %} {# 使用load标签加载自定义过滤器的文件名 #}
<!DOCTYPE html>
{{ value|time_since }}
- 运行<br /><a name="66e131dc"></a>### 模板标签和模板过滤器查看```pythonfrom django.template import defaultfilters, defaulttags
