您的位置:首页 > 编程语言 > Go语言

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

2017-08-12 16:08 946 查看

前提:自定义模板标签和过滤器必须位于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.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 %}
View Code

 

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>

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: