Django从理论到实战(part20)--DLT常用过滤器

    技术2025-09-07  42

    学习笔记,仅供参考

    参考自:Django打造大型企业官网–Huang Y;

    本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的记录一下。


    文章目录

    DLT常用过滤器过滤器简介准备工作过滤器add过滤器cut过滤器date过滤器default过滤器default_if_none过滤器first过滤器last过滤器join过滤器length过滤器lower过滤器upper过滤器random过滤器slice过滤器stringtags过滤器truncatechars过滤器truncatechars_html


    DLT常用过滤器

    过滤器简介

    在模版中,有时候需要对一些数据进行处理以后才能使用。在Python中我们通过函数的形式来完成,而在模版中,则是通过过滤器来实现,过滤器中是通过|来处理数据的。

    准备工作

    我们首先新建一个项目newwebsite2,专门学习这个知识点:

    django-admin startproject newwebsite2

    进入项目文件夹:

    cd newwebsite2

    开启服务:

    python manage.py runserver

    在项目下创建模板文件夹templates,并在settings.py中设置模板文件夹的路径:

    TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]

    过滤器add

    该过滤器会将传进来的参数添加到value上,例如:

    {{ value|add:"2" }}

    上面的代码中,如果value是等于4,那么结果将是6,如果value是等于一个普通的字符串,比如abc,那么结果将是abc2,add过滤器的源代码如下:

    def add(value, arg): try: return int(value) + int(arg) except (ValueError, TypeError): try: return value + arg except Exception: return '' 举个例子

    现在,我们创建一个模板文件add_file.py:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>小黄之家</title> </head> <body> <p> {{ value1|add:value2 }} </p> </body> </html>

    在主urls.py文件中添加路由:

    from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('admin/', admin.site.urls), path('add/', views.add_list), ]

    创建视图函数:

    from django.http import HttpResponse from django.shortcuts import render def add_list(request): context = { "value1":[1, 2, 3], "value2":[4, 5, 6] } return render(request, "add_file.html", context = context)

    向http://127.0.0.1:8000/add/发起访问:

    过滤器cut

    该过滤器会移除value中所有指定的字符串,类似于python中的replace(args,""),例如:

    {{ value|cut:" " }}

    上述的代码将会移除value中所有的空格字符。

    cut过滤器的源代码如下:

    def cut(value, arg): """Remove all values of arg from the given string.""" safe = isinstance(value, SafeData) value = value.replace(arg, '') if safe and arg != ';': return mark_safe(value) return value 举个例子

    现在,我们创建一个模板文件cut_file.py:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>小黄之家</title> </head> <body> <p> {{ "Hello World !"|cut:" " }} </p> </body> </html>

    在主urls.py文件中添加路由:

    urlpatterns = [ path('admin/', admin.site.urls), path('add/', views.add_list), path('cut/', views.cut_list), path('my_test/', views.my_test), ]

    创建视图函数:

    def cut_list(request): return render(request, "cut_file.html")

    向http://127.0.0.1:8000/cut/发起访问:

    过滤器date

    该过滤器将一个日期按照指定的格式,格式化成字符串,例如:

    #视图模块中 context = { "birthday": datetime.now() } #模版文件中 {{ birthday|date:"Y/m/d" }}

    上述的代码将会输出2020/07/04。其中Y代表的是四位数字的年份,m代表的是两位数字的月份,d代表的是两位数字的日。

    更多时间格式化的方式,见下表:

    格式字符描述示例Y四位数字的年份2018m两位数字的月份01-12n月份,1-9前面没有0前缀1-12d两位数字的天01-31j天,但是1-9前面没有0前缀1-31g小时,12小时格式的,1-9前面没有0前缀1-12h小时,12小时格式的,1-9前面有0前缀01-12G小时,24小时格式的,1-9前面没有0前缀1-23H小时,24小时格式的,1-9前面有0前缀01-23i分钟,1-9前面有0前缀00-59s秒,1-9前面有0前缀00-59

    过滤器default

    如果value被评估为False,就使用default过滤器提供的默认值,例如:

    {{ value|default:"nothing" }}

    如果value是等于一个空的字符串。比如"",那么以上代码将会输出nothing。

    备注:[],"",None,{}等这些在if判断中为False的value,在default过滤器中会被评估为False

    过滤器default_if_none

    如果value是None,就使用default_if_none提供的默认值,例如:

    {{ value|default_if_none:"nothing" }}

    如果value等于"",即空字符串,以上代码会输出空字符串,只有当value为None时,以上代码才会输出nothing。

    过滤器first

    该过滤器将返回列表/元组/字符串中的第一个元素,例如:

    {{ value|first }}

    上述代码中,如果value为['a','b','c'],那么将返回a。

    过滤器last

    该过滤器将返回列表/元组/字符串中的最后一个元素,示例代码如下:

    {{ value|last }}

    如果value是等于['a','b','c'],那么将返回c。

    过滤器join

    该过滤器类似于Python中的join函数,将列表/元组/字符串用指定的字符进行拼接,例如:

    {{ value|join:"-" }}

    如果value是等于['a','b','c'],那么将返回a-b-c。

    过滤器length

    该过滤器将获取列表/元组/字符串/字典的长度,例如:

    {{ value|length }}

    如果value是等于['a','b','c'],那么将返回3;如果value为None,那么将返回0。

    过滤器lower

    该过滤器将value中所有的字符全部转换成小写,例如:

    {{ value|lower }}

    如果value等于Hello World,那么将输出hello world。

    过滤器upper

    该过滤器类似于lower,只不过是将指定的字符串全部转换成大写。

    过滤器random

    该过滤器可以在列表/字符串/元组中随机的选择一个值,例如:

    {{ value|random }}

    如果valued等于['a','b','c'],那么Django将会在a, b, c中随机选择一个返回。

    过滤器slice

    该过滤器类似于Python中的切片操作,例如:

    {{ some_list|slice:"2:" }}

    以上代码将会将some_list从2开始做切片操作。

    过滤器stringtags

    该过滤器会删除字符串中所有的html标签,例如:

    {{ value|striptags }}

    如果value是<strong>hello world</strong>,那么将会输出hello world。

    过滤器truncatechars

    如果字符串value的长度超过了该过滤器指定的长度,那么就会进行切割,并且会拼接三个点来作为省略号,例如:

    {{ value|truncatechars:5 }}

    如果value等于北京欢迎您~,那么输出的结果是北京...

    这就奇怪了,为什么输出结果不是北京欢迎您…呢?

    这是因为,三个点也占了三个字符,北京+ ... 的字符长度为5,所以是北京...

    当字符串vlaue的长度没有超过该过滤器指定的长度,那么将不进行切割,例如:

    {{ "马鞍山"|truncatechars:5 }}

    上述代码的输出结果依然是马鞍山

    过滤器truncatechars_html

    该过滤器类似于truncatechars,只不过不会切割html标签,例如:

    {{ value|truncatechars:5 }}

    如果value是等于<p>北京欢迎您~</p>,那么输出的是<p>北京...</p>。

    Processed: 0.010, SQL: 9