小白学习django第三站-自定义过滤器及标签

时间:2021-10-15 19:46:08

要使用自定义过滤器和标签,首先要设置好目录结构

现在项目目录下建立common的python包

小白学习django第三站-自定义过滤器及标签

再将common加入到setting.py中的INSTALLED_APP列表中

小白学习django第三站-自定义过滤器及标签

在common创建目录templatetags,再在其中创建自定义过滤器和标签等

小白学习django第三站-自定义过滤器及标签

在自定义common_extras.py中编写自定义过滤器和标签

from django import template
import datetime register = template.Library() # 固定写法 @register.filter
def my_sort(value):
a = sorted(value)
return a @register.filter('myup')
def my_upper(value):
return value.upper() @register.filter
def my_cut(value, arg):
c = value.replace(arg, '+')
return c # 不带参数
@register.simple_tag
def current_time1():
format_string = "%Y年%m月%d日 %H:%M:%S"
return datetime.datetime.now().strftime(format_string) # 带参数
@register.simple_tag
def current_time2(formate_string):
return datetime.datetime.now().strftime(formate_string) # 带上下文参数的
@register.simple_tag(takes_context=True) # 允许使用上下文
def current_time3(context):
format_string = context.get('format_string')
return datetime.datetime.now().strftime(format_string)
# format_string = context.get('format_string')
# return format_string @register.simple_tag
def add(a, b):
c = a + b
return c @register.simple_tag(takes_context=True)
def sorted1(context):
b = context.get('list')
return sorted(b)
# 包含标签
# 不带参数
@register.inclusion_tag('test_app/show_takes.html')
def show_results1():
li = ['web', 'c++', 'python', 'java', 'php']
return {'choice': li} # 带参数
@register.inclusion_tag('test_app/show_takes.html')
def show_results2(li):
return {'choice': li} # 上下文参数
@register.inclusion_tag('test_app/show_takes.html', takes_context=True)
def show_results3(context):
data = context.get('list')
return {'choice': data}

test HTML中编写

{%  load common_extras %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<ul style="color: blue">自定义过滤器
<li>将名字大写:{{ name|myup }}</li>
<li>将列表按顺序:{{ list|my_sort }}</li>
<li>替换字母{{ name }}:{{ name|my_cut:'u' }}</li>
</ul> <ul style="color:green">简单自定义标签
<li>不带参数输出:{% current_time1 %}</li>
<li>带参数输出:{% current_time2 "%Y年%m月%d日 %H:%M:%S" %}</li>
<li>使用上下文输出:{% current_time3 %}</li>
<li>使用加法:{% add 1 2 %}</li>
<li>使用上下文排序:{% sorted1 %}</li>
</ul> <ul style="color:red">包含自定义标签
<li>不带参数:{% show_results1 %}</li>
<li>带参数:{% show_results2 '12345' %}</li>
<li>使用上下文:{% show_results3 %}</li>
</ul>
</body>
</html>

test.py 文件中编写

def func(requset):
return render(requset, 'test_app/test1.html',
context={
'name': 'xuning',
'age': 33,
'list': [1, 2, 4, 3, 6, 5],
'format_string': "%Y年%m月%d日 %H:%M:%S",
})

show_take.html 文件中编写(包含标签):多次调用这个方法,只有choice变量这个不同,可以将这部分代码进行封装

{% for i in choice %}
{{ i }}
{% endfor %}

浏览器中显示

小白学习django第三站-自定义过滤器及标签