自定义过滤器
- 步骤
- 自定义的模板过滤器必须放在
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.py
def 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 />![](https://cdn.nlark.com/yuque/0/2019/png/367873/1559638026272-493ba163-6c44-44e1-92ac-84ee546a3418.png#align=left&display=inline&height=195&originHeight=195&originWidth=289&size=0&status=done&width=289)
<a name="00a95e48"></a>
### 自定义事件计算过滤器
- 获得一条信息发表的时间。该时间是距离现在多久。比如`刚刚`, `2小时前`等。可以自定义一个过滤器。
- 实例
- 在上面的`my_filter.py`中定义过滤器和注册过滤器
```python
from django import template
from datetime import datetime
register = template.Library() # 注册library
@register.filter()
def time_since(value):
minute = 60
hour = minute*60
day = hour*34
month = day*31
if not isinstance(value, datetime):
return value
now = datetime.now()
# now-value是一个timedelay类型,有一个total_second()方法
timestamp = (now-value).total_seconds() # 时间戳
if timestamp < minute:
return "刚刚"
elif minute <= timestamp < hour: # 简化链式只适合and
m = 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.py
from datetime import datetime
def 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 />![](https://cdn.nlark.com/yuque/0/2019/png/367873/1559638026168-836529da-5233-4ca8-9746-04849f949b70.png#align=left&display=inline&height=159&originHeight=159&originWidth=278&size=0&status=done&width=278)
<a name="66e131dc"></a>
### 模板标签和模板过滤器查看
```python
from django.template import defaultfilters, defaulttags