Django框架模版之自定义过滤器及标签

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

自定义过滤器

虽然有了django给我们提供的这么多方便的标签和过滤器;但是有些时候,还不能达成我们想要的功能,那么就需要我们自定义标签和过滤器

django默认的过滤器及标签文件夹

django/template/defaultfilters.py 
django/template/defaulttags.py

  1. 当前app下创建保存自定义标签及过滤器的文件夹,这个文件夹常命名为templatetags

  2. 为了支持该文件夹可以作为模块导入,templatetags文件夹下创建__init__.py文件

  3. 创建过滤器xxxx.py文件,文件名自定义

  4. 过滤器文件头部必须包含名为register的全局变量,该变量是template.Library对象的实例

    扫描二维码关注公众号,回复: 13186142 查看本文章
  5. 自定义过滤器为一个Python函数,参数可以是1-2

    • 比如{ { value|upper }},过滤器函数名为upper,参数为value
  6. 最重要的一步,所有编写完成的过滤器函数,都要记得:使用register.filter()函数将其注册为Library实例

register.filter(name=None, filter_func=None)
# 注册过滤函数
'''
name: 一个字符串,表示过滤器在模板的使用名称
filter_func: 编写好的过滤器函数
'''
  • 注意:过滤器参数可以是一个字符串,也可以使类似列表的其他类型,参数可以设置默认值。另外需要注意的是模板中无法进行异常处理,过滤器一旦出现错误,将会引发服务器错误
# app/templatetags/my_filter.py
from django import template
register = template.Library()
def return_length(value):
    #  返回变量长度
    return len(str(value))
register.filter("return_length",return_length)
<p>{
   
   { 'abc'|return_length }}</p>
<!-- 返回3 -->

此外:除了我们使用register.filter函数来对过滤器函数进行注册;

还可以将register.filter作为装饰器@register.filter来使用,可以更加方便的进行过滤器函数注册

from django import template
register = template.Library()

@register.filter(name="delete_space")
def delete_space(value):
    # 去掉value数据中所有空格
		return value.replace(" ","")

但是,这里有个问题,我们的过滤器经常期望处理的数据类型是一个字符串,但是以上过滤器如果在对数字类型进行处理时,会引发'int' object has no attribute 'replace',这样的错误,那么需要我们对传入过滤器的value参数进行字符串转变的处理

解决办法也很简单,大家可能想到了直接用字符串工厂函数去转换传入参数、但是这里有更加优雅安全的方式,通过django.template.defaultfilter模块下的stringfilter装饰器来对过滤器函数进行装饰

stringfilter这个装饰器可以帮助我们把传入过滤器函数的参数转换为它的字符串值

from django.template.defaultfilters import stringfilter
@register.filter(name="delete_space")
@stringfilter
def delete_space(value):
		return value.replace(" ","")

现在过滤器函数的value参数将会先被装饰器**@stringfilter**处理成对应的字符串类型之后

才会被作为参数传递到过滤器函数delete_space中;接着通过这个过滤器处理一个非字符串类型也就不会在报错了


自定义标签

标签要实现的功能可以比过滤器更加强大,可以支持接收更多参数!

基本使用语法

{% tag "arg1" "arg2" "arg3" ... %}

很多模板标签可以接收多个参数,字符串或者模板变量;并且可以将这些变量经过一系列处理之后返回一个字符串这样的标签我们可以通过django为我们提供的simple_tag()注册函数来进行编写,该函数来自于django.template.Library

同样的,编写自定义标签函数完成之后,也需要进行注册,也可以直接将@simple_tag作为装饰器使用注册

from django import template
register = template.Library()

@register.simple_tag(name="myUpper")
def myUpper(value):
    # 将模板变量处理为纯大写的模板标签
    return str(value).upper()
# register.simple_tag(name="myUpper",func=myUpper)
  • simple_tag()函数在这里帮助我们做了如下工作:
    1. 检查标签函数所需参数数量
    2. 截掉参数中的引号,确保函数接收到的是一个普通的字符串
    3. 截掉参数中的引号,确保函数接收到的是一个普通的字符串

如果我们希望标签函数可以访问到当前模板中其他全部的模板变量值;那么可以使用*simple_tag(takes_context=True)*参数

  • 比如通过视图函数向模板返回了
value = '哈哈哈哈哈哈'
return render(request, template, locals())

可以在自定义标签处通过simple_tag(takes_context=True)来进行视图函数中content值的获取;

但是还要注意的是,此时自定义标签函数参数位置第一个必须为context

@register.simple_tag(takes_context=True)
def get_context(context):
	value = context.get("value")
	return "获取到的模板变量:%s" % value

模板页面直接使用

<p>{% get_context %}</p>

猜你喜欢

转载自blog.csdn.net/HeroicLee/article/details/121361912
今日推荐