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

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

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

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

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

在自定义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 %}

 

 浏览器中显示

 

 

posted @ 2019-08-03 15:18  ningod  阅读(204)  评论(0)    收藏  举报