前提:自定义模板标签和过滤器必须位于Django的某个应用中,这个应用可以包含一个templatetags目录, 和models.py views.py 处于同一级目录。若这个templatetags目录不存在则创建他,同时在该目录下建立一个py文件:__init__.py 文件,使得该目录可以作为Python包。在添加这个模块后,需要重启服务器以便使用。注意命名不要冲突。eg:

polls/
__init__.py
models.py
templatetags/ 在模板中可以这样用:{% load poll_extras %}
__init__.py
poll_extras.py
views.py

一.自定义过滤器

自定义过滤器就是一个带有一个或两个参数的python函数:

>变量值:不一定为字符串形式。(此参数为输入)

>参数值:可以有初始值。(此参数可不要)

def cut(value, arg):  # value为变量, arg为参数
return value.replace(arg, '') # 此过滤器实现将变量value中的arg全部替换为‘ ’

使用该过滤器的方法:  {{   somevariable  |  cut:"0"   }}

def lower(value): # 只有变量,没有参数,大多数过滤器无参数
return value.lower() # 此过滤器实现将变量value变为小写

写完过滤器函数后可以需要进行注册才可以以使用:

register.filter('cut', cut)  # Library.filter()有两个参数,过滤器名称,编译的函数
register.filter('lower', lower)

还可以把register.filter()用作装饰器,更简洁:

@register.filter(name='cut') #过滤器名字为cut
def cut(value, arg):
return value.replace(arg, '') @register.filter
def lower(value):
return value.lower()

特别的,如果只希望用一个字符串来作为第一个参数的模板过滤器,你应当使用stringfilter装饰器。这将在对象被传入你的函数之前把这个对象转换成它的字符串值:

from django import template
from django.template.defaultfilters import stringfilter register = template.Library() @register.filter
@stringfilter
def lower(value):
return value.lower() # 传递整数也不会出现AttributeError (因为整数没有 lower()方法).

二.自定义模板标签

1.简单的标签 :django.template.Library.simple_tag()

许多模板标签接收多个参数 —— 字符串或模板变量 —— 并在基于输入的参数和一些其它外部信息进行一些处理后返回一个字符串。例如,current_time 标签可能接受一个格式字符串,并返回与之对应的格式化后的时间。为了简单化这些类型标签的创建,Django 提供一个辅助函数simple_tag。eg:

import datetime
from django import template register = template.Library() @register.simple_tag
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)

如果你的模板标签需要访问上下文,可在注册标签时使用takes_context参数:

@register.simple_tag(takes_context=True)
def current_time(context, format_string):
timezone = context['timezone']
return your_get_current_time_method(timezone, format_string)

如果你需要重命名标签可以给它提供自定义的名称:

register.simple_tag(lambda x: x - 1, name='minusone')

@register.simple_tag(name='minustwo')
def some_function(value):
return value - 2

simple_tag 函数可以接受任意数量的位置参数和关键字参数, 然后在模板中,可将任意数量的由空格分隔的参数传递给模板标签。像在Python 中一样,关键字参数的值的设置使用等号("=") ,并且必须在位置参数之后提供。eg:

@register.simple_tag
def my_tag(a, b, *args, **kwargs):
warning = kwargs['warning']
profile = kwargs['profile']
...
return ... {% my_tag 123 "abcd" book.title warning=message|lower profile=user.profile %}

filter过滤器和simple_tag的相同点和不同点:参考

2.赋值标签:django.template.Library.assignment_tag()

为了简单化设置上下文中变量的标签的创建,Django 提供一个辅助函数assignment_tag。这个函数方式的工作方式与simple_tag 相同,不同之处在于它将标签的结果存储在指定的上下文变量中而不是直接将其输出。eg:

@register.assignment_tag
def get_current_time(format_string):
return datetime.datetime.now().strftime(format_string)

然后可以利用 as 参数后面跟随变量的名称将结果存储在模板变量中,并将它输出到你觉得合适的地方:

{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>The time is {{ the_time }}.</p>

如果你的模板标签需要访问上下文,你可以在注册标签时使用takes_context参数:

@register.assignment_tag(takes_context=True)
def get_current_time(context, format_string):
timezone = context['timezone']
return your_get_current_time_method(timezone, format_string)

assignment_tag 函数可以接受任意数量的位置参数和关键字参数。例如:

@register.assignment_tag
def my_tag(a, b, *args, **kwargs):
warning = kwargs['warning']
profile = kwargs['profile']
...
return ... {% my_tag 123 "abcd" book.title warning=message|lower profile=user.profile as the_result %}

example1:

利用自定义过滤器将文章发布时间的月份改为大写:即8月改为八月

在templatetags目录下创建__init__.py后,建立myfilter.py文件:

from django import template
register = template.Library() # 定义一个将日期中的月份转换为大写的过滤器,如8转换为八
@register.filter
def month_to_upper(key):
return ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'][key.month-1] # 注册过滤器
# register.filter('month_to_upper', month_to_upper)

在html模板中这样使用:

% load myfilter %}

    <div class="postdate">
<div class="month">{{ article.date_publish | month_to_upper }}</div> # 自己写的过滤器,只有变量,没有输入参数
<div class="date">{{ article.date_publish | date:'d' }}</div> # django自带的过滤器date,含输入参数 ,过滤出日期(date_publish变量)中的 ‘天’
</div>

example2:

利用自定义模板标签实现侧边栏: 最新文章、归档、分类:

在templatetags目录下创建__init__.py后,建立blog_tags.py文件:

from django import template
from ..models import Post,Category register = template.Library() @register.assignment_tag
def get_recent_posts(num=5): #最新的前5篇文章
return Post.objects.all().order_by('-created_time')[:num] @register.assignment_tag
def archives(): # 文章归档:17年8月 17年7月...
return Post.objects.dates('created_time', 'month', order='DESC') # 三个参数解释:字段名称 year/month/day ASC升序,DESC降序 @register.assignment_tag
def get_categories(): # 文章分类
return Category.objects.all()

在html模板中这样使用:


{% load blog_tags %}
                <div class="widget widget-recent-posts">
<h3 class="widget-title">最新文章</h3>
{% get_recent_posts as recent_post_list %} #注意参数as后面才是变量名称
<ul>
{% for post in recent_post_list %}
<li>
<a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
</li>
{% empty %}
暂无文章!!!
{% endfor %}
</ul>
</div> <div class="widget widget-archives">
<h3 class="widget-title">归档</h3>
{% archives as date_list %}
<ul>
{% for date in date_list %}
<li>
<a href="{% url 'blog:archives' date.year date.month %}">
{{ date.year }} 年 {{ date.month }} 月</a>
</li>
{% empty %}
暂无归档!!!
{% endfor %}
</ul>
</div> <div class="widget widget-category">
<h3 class="widget-title">分类</h3>
{% get_categories as categories_list %}
<ul>
{% for category in categories_list %}
<li>
<a href="{% url 'blog:category' category.pk %}">{{ category.name }}</a>
</li>
{% empty %}
暂无分类!!!
{% endfor %}
</ul>
</div>

Django 自定义过滤器和模板标签的更多相关文章

  1. Django 自定义 过滤器和模板标签

    代码布局(自定义的代码,放在哪里) 二种方式:1. 某个app特有的 -app 目录下,templatetags 文件夹     ** 必需是这个名称的包(目录中有__init__.py文件) -再到 ...

  2. django自定义过滤器及模板标签

    创建一个模板库 不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 m ...

  3. Django自定义过滤器及标签

    一.自定义过滤器 1.自定义过滤器文件存放位置 在APP应用下创建名为templatetags(该文件夹名固定)的文件包(包含__init__.py文件) 注意APP必须在setting中注册 即在s ...

  4. python的Web框架,Django自定义过滤器及标签

    代码布局 有的时候框架给的过滤器不够用,需要自定义一些过滤器,所以就需要我们自己来定义一些过滤器等 自定义代码放置的路径 某个app特用(独有)的 - app 目录下的 templatetags文件夹 ...

  5. django自定义过滤器和标签

    1.自定义过滤器和标签的流程: 1.在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为app01的app下创建了一个templatetags的包,并在该包下创 ...

  6. django 自定义过滤器(filter)处理较为复杂的变量的实例

    简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能 ...

  7. Django自定义过滤器中is_safe和need_autoescape两个参数的理解

    自定义template过滤器的方法参考文档,不再赘述 is_safe 文档说明过滤的两种最终形态,其中一种是设置register.filter(is_safe=True),但是对is_safe的具体作 ...

  8. Django 自定义过滤器

    设定自定义过滤器之前要现在配置文件内把自己项目名在 INSTALLED_APPS 内导入 #已安装的django应用 INSTALLED_APPS = [ 'django.contrib.admin' ...

  9. Django和Angular.js模板标签冲突的解决方式

    参考文章:http://yanhua365.lofter.com/post/b417f_1f0361 http://stackoverflow.com/questions/8302928/angula ...

随机推荐

  1. 自学Aruba5.3.4-Aruba安全认证-有PEFNG 许可证环境的认证配置802.1x

    点击返回:自学Aruba之路 自学Aruba5.3.4-Aruba安全认证-有PEFNG 许可证环境的认证配置802.1x 1. 采用InterDB认证服务器完成802.1X认证 (Aruba650) ...

  2. Java NIO -- 管道 (Pipe)

    Java NIO 管道是2个线程之间的单向数据连接. Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 举个例子: package com.soyo ...

  3. [POI2015]CZA

    [POI2015]CZA p很小,讨论 p=0... p=1... p=2:n-1放左或者放右两种情况,剩下怎么放是固定的,模拟然后判断即可 p=3: 正着做要状压,类似放书和排座位那些题,考虑以某个 ...

  4. $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换

    \(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...

  5. 用c语言实现http请求

    用c语言来实现一个简单的http请求,请求 www.cnblogs.com 首页 #include<stdio.h> #include<stdlib.h> #include&l ...

  6. 串口、COM口、TTL、RS-232、RS-485区别详解

    1.串口.COM口是指的物理接口形式(硬件).而TTL.RS-232.RS-485是指的电平标准(电信号).    2.接设备的时候,一般只接GND RX TX.不会接Vcc或者+3.3v的电源线,避 ...

  7. 多线程Java Socket编程

    采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求. 1.服务端 package localSocket; import java.i ...

  8. go struct结构体

    struct结构体 用来自定义复杂数据结构 struct里面可以包含多个字段(属性),字段可以是任意类型 struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以 ...

  9. ajax跨域原理以及jsonp使用

    jsonp介绍: JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题. 由于同源策略,一般来说位于 server1.example. ...

  10. lombok 工具类的介绍

    lombok 是一个非常非常好用的工具类.打个比方,一个bean,需要字段,get set方法 无参有参构造器,重写equals和hashcode,字段一多很麻烦.它,就是来解决这个问题的.一个注解全 ...