.Tang

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  • 自定义过滤器
    • DTL模板语言生来只是为了方便的展示信息,所以与编程语言相比显得有点薄弱,有时候不能满足我们的需求。因此django提供了一个接口,让开发者能自定义标签和过滤器。
    • 首先,你需要添加一个templatetags的文件夹, 自定义过滤器必须处在已经安装了的app中的一个名叫”templatetags”的包(文件夹)中。因此可以有两种选择:
      • 一种是放在其他已经安装了的app中。这种方式简单,但不方便管理。
      • 单独创建一个app,用来存放所有的自己定义的过滤器。 推荐使用
    • ps: templatetags 文件夹名字不能修改,这是django固定死的

1.使用上述第二种创建公用的app utils       ------      工具,在utils app下创建templatetags包固定名称,  ps:不要丢失 __init__.py  否则模板中加载不到

在templatetags下创建xxx.py文件,编写过滤器

2.py文件中   utils.templatetags.xxx.py 

# coding=utf-8
from django import template

# 代表该文件是自定义标签名 register固定写法
register = template.Library()

# html模板中调用{{ msg|myCut:'args' }}  需要导入该py文件   {% load py_file_name %}
@register.filter  # 过滤器装饰器
def myCut(value, args):
    # 根据需求编写代码
    return u'自定义过滤器某些字符返回小写: %s' % (value.replace(args, '').lower())  # python2默认ascill码 u'中文'  unicode, pyhon3默认unicode

3.***需要在settings文件中导入该app  utils

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'utils', # 创建自定义过滤器需要引入该app
]

 自定义标签:

引用上述第二步pyfile:

@register.simple_tag
def current_time(time_geshi):  #html模板中调用 {% current_time '%Y-%m-%d %}
    return datetime.now().strftime(time_geshi)

自定义包含标签

应用场景:重复出现在html页面中的动态数据,而其他页面需要include 这个页面,会引用一次,需要在view中传值一次。

而将数据定义在包含标签,通过装饰器@register.inclusion_tag("my_menu11.html") 指定一个页面接收该数据,其他所有页面都可以通过 定义的{% my_menu %}去调用,类似 {% include "my_menu11.html"%}的效果.    ps需要先加载该包含标签Py文件 {% load pyfilename %}

 

引用上述第二步pyfile:

@register.inclusion_tag("my_menu.html") #将返回值传给my_menu.html渲染 在将my_menu11.html引用给目标html。  ps:在目标html中使用 {% my_menu %}引用
def my_menu():   # 不加参数                   # 类似在目标html使用{% include my_menu.html %}
    menu = {'a', 11, 'name': 'xiaom', 'age': 18}return {'menu': menu}

 my_menu11.html

{% for m,v in menu.items %}
    {{ m }}: {{ v }}
{% endfor %}

 渲染的目标html中使用 {% my_menu %}引用

{% load custom %}    加载自定义包含标签py文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
自定义包含标签<br>{% my_menu %}<br>
</body>
</html>

 

posted on 2018-05-08 12:50  .Tang  阅读(259)  评论(0编辑  收藏  举报