Django4:模板(下)—自定义过滤器_django-filter 在django4

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

自定义模版过滤器

虽然DTL给我们内置了许多好用的过滤器。但是有些时候还是不能满足我们的需求。因此Django给我们提供了一个接口,可以让我们自定义过滤器,实现自己的需求。

模版过滤器必须要放在app中,并且这个app必须要在INSTALLED_APPS中进行安装。然后再在这个app下面创建一个Python包叫做templatetags。再在这个包下面创建一个python文件。比如app的名字叫做book,那么项目结构如下:

  • book
  • views.py
  • urls.py
  • models.py
  • templatetags
  • my_filter.py

在创建了存储过滤器的文件后,接下来就是在这个文件中写过滤器了。过滤器实际上就是python中的一个函数,只不过是把这个函数注册到模板库中,以后在模板中就可以使用这个函数了。但是这个函数的参数有限制,第一个参数必须是这个过滤器需要处理的值,第二个参数可有可无,如果有,那么就意味着在模板中可以传递参数。并且过滤器的函数最多只能有两个参数。在写完过滤器后,再使用django.template.Library对象注册进去。示例代码如下:

from django import template

创建模板库对象

register = template.Library()

过滤器函数

def mycut(value,mystr):
return value.replace(mystr)

将函数注册到模板库中

register.filter(“mycut”,mycut)

以后想要在模板中使用这个过滤器,就要在模板中load一下这个过滤器所在的模块的名字(也就是这个python文件的名字)。示例代码如下:

{% load my_filter %}

自定义时间计算过滤器

有时候经常会在朋友圈、微博中可以看到一条信息发表的时间,并不是具体的时间,而是距离现在多久。比如刚刚,1分钟前等。这个功能DTL是没有内置这样的过滤器的,因此我们可以自定义一个这样的过滤器。示例代码如下:

time_filter.py文件

from datetime import datetime
from django import template

register = template.Library()

def time_since(value):
“”"
time距离现在的时间间隔

  1. 如果时间间隔小于1分钟以内,那么就显示“刚刚”
  2. 如果是大于1分钟小于1小时,那么就显示“xx分钟前”
  3. 如果是大于1小时小于24小时,那么就显示“xx小时前”
  4. 如果是大于24小时小于30天以内,那么就显示“xx天前”
  5. 否则就是显示具体的时间 2017/10/20 16:15
    “”"
    if isinstance(value,datetime):
    now = datetime.now()
    timestamp = (now - value).total_seconds()
    if timestamp < 60:
    return “刚刚”
    elif timestamp >= 60 and timestamp < 60*60:
    minutes = int(timestamp / 60)
    return “%s分钟前” % minutes
    elif timestamp >= 60*60 and timestamp < 60*60*24:
    hours = int(timestamp / (60*60))
    return “%s小时前” % hours
    elif timestamp >= 60*60*24 and timestamp < 60*60*24*30:
    days = int(timestamp / (60*60*24))
    return “%s天前” % days
    else:
    return value.strftime(“%Y/%m/%d %H:%M”)
    else:
    return value

register.filter(“time_since”,time_since)

在模版中使用的示例代码如下:

{% load time_filter %}

{% value|time_since %}

为了更加方便的将函数注册到模版库中当作过滤器。也可以使用装饰器来将一个函数包装成过滤器。示例代码如下:

from django import template
register = template.Library()

@register.filter(name=‘mycut’)
def mycut(value,mystr):
return value.replace(mystr,“”)

模板结构优化

引入模版

有时候一些代码是在许多模版中都用到的。如果我们每次都重复的去拷贝代码那肯定不符合项目的规范。一般我们可以把这些重复性的代码抽取出来,就类似于Python中的函数一样,以后想要使用这些代码的时候,就通过include包含进来。这个标签就是include。示例代码如下:

header.html

我是header

footer.html

我是footer

main.html

{% include ‘header.html’ %}

我是main内容

{% include 'footer.html' %}

include标签寻找路径的方式。也是跟render渲染模板的函数是一样的。

默认include标签包含模版,会自动的使用主模版中的上下文,也即可以自动的使用主模版中的变量。如果想传入一些其他的参数,那么可以使用with语句。示例代码如下:

header.html

用户名:{{ username }}

main.html

{% include “header.html” with username=‘huangyong’ %}

模板继承

在前端页面开发中。有些代码是需要重复使用的。这种情况可以使用include标签来实现。也可以使用另外一个比较强大的方式来实现,那就是模版继承。模版继承类似于Python中的类,在父类中可以先定义好一些变量和方法,然后在子类中实现。模版继承也可以在父模版中先定义好一些子模版需要用到的代码,然后子模版直接继承就可以了。并且因为子模版肯定有自己的不同代码,因此可以在父模版中定义一个block接口,然后子模版再去实现。以下是父模版的代码:

{% load static %}

{% block title %}我的站点{% endblock %}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-sw16V8qv-1713297535936)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用Django中的装饰器 @register.filter(name='custom_filter') 来注册自定义过滤器。这个装饰器可以把函数注册为一个过滤器并指定过滤器的名称。使用方法如下: 1. 在app下的一个文件中新建.py文件,定义一个过滤器函数。 2. 在app下的一个文件中新建一个名为“templatetags”的文件夹,将步骤1中定义的.py文件放入其中,并在该目录下新建一个空文件__init__.py。 3. 在模板中使用{% load 文件名 %}加载刚才定义的过滤器。 4. 在模板中使用{{ 变量|过滤器 }}调用过滤器。 示例代码: ```python # my_filter.py from django import template register = template.Library() @register.filter(name='add_str') def add_str(value, arg): return str(value) + str(arg) ``` ```html <!-- 模板中使用 --> {% load my_filter %} {{ 'hello'|add_str:'world' }} ``` 这样就会输出“helloworld”。 ### 回答2: 在Django中使用自定义过滤器,首先需要将过滤器注册到Django过滤器库中。以下是注册过滤器的步骤: 1. 在Django项目的一个应用中创建一个名为"templatetags"的文件夹。如果该文件夹已经存在,则跳过此步骤。 2. 在"templatetags"文件夹中创建一个名为"__init__.py"的空文件,以确保该文件夹被认为是一个模块。 3. 在"templatetags"文件夹中创建一个名为"custom_filters.py"的文件。这个文件将包含我们自定义过滤器函数。 4. 在"custom_filters.py"文件中编写我们的自定义过滤器函数。函数必须接受至少一个参数,并返回处理后的值。 5. 在"custom_filters.py"文件中导入Django过滤器库,通过引入`from django import template`。 6. 在"custom_filters.py"文件中使用`register = template.Library()`来创建一个过滤器注册实例。 7. 在"custom_filters.py"文件中使用`@register.filter(name='filter_name')`装饰器来注册我们的过滤器函数,并指定过滤器的名称。 8. 在"custom_filters.py"文件中保存我们的自定义过滤器函数。 9. 在我们的Django模板中,需要首先加载我们的自定义过滤器。通过在模板的顶部使用`{% load custom_filters %}`加载我们的自定义过滤器模块。 10. 在模板中使用我们的自定义过滤器。通过在变量后使用管道符号(|)和过滤器名称来调用自定义过滤器,例如`{{ variable|filter_name }}`。 通过以上步骤,我们就可以在Django中注册和使用我们的自定义过滤器了。确保在注册、命名和调用过程中保持一致,以确保过滤器正常工作。 ### 回答3: 在Django中使用自定义过滤器,需要首先在你的应用程序(app)中创建一个名为templatetags的文件夹,并在该文件夹下创建一个Python模块(.py文件),用于存放你的自定义过滤器代码。 在该模块中,你需要导入`django.template.library`模块,并使用`register.filter`装饰器来注册你的自定义过滤器函数。 以下是一个示例: ```python from django import template register = template.Library() @register.filter def my_filter(value, arg): # 这里是你的自定义过滤器代码 # value 是传递给过滤器的对象 # arg 是过滤器的参数 # 返回经过处理后的值 return processed_value ``` 在这个示例中,我们创建了一个名为my_filter自定义过滤器函数。它接收两个参数:value和arg。在函数中,你可以根据自己的需求对value进行处理,并返回处理后的值。 完成自定义过滤器函数的编写后,你需要在模板中使用该过滤器。首先,在你要使用该过滤器的地方,确保在模板顶部进行导入: ```python {% load 自定义过滤器模块名称 %} ``` 然后,就可以在模板中使用这个过滤器了: ```python {{ value|my_filter:arg }} ``` 在上面的示例中,value是要进行处理的对象,my_filter是你的自定义过滤器函数名称,arg是过滤器的参数(可选)。 通过以上步骤,你就可以在Django中成功注册和使用自定义过滤器了。确保在注册过滤器后重新启动你的Django应用程序,以使过滤器生效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值