学习笔记,仅供参考
参考自:Django打造大型企业官网–Huang Y;
本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的记录一下。
在模版中,有时候需要对一些数据进行处理以后才能使用。在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', ], }, }, ]该过滤器会将传进来的参数添加到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/发起访问:
该过滤器会移除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/发起访问:
该过滤器将一个日期按照指定的格式,格式化成字符串,例如:
#视图模块中 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如果value被评估为False,就使用default过滤器提供的默认值,例如:
{{ value|default:"nothing" }}如果value是等于一个空的字符串。比如"",那么以上代码将会输出nothing。
备注:[],"",None,{}等这些在if判断中为False的value,在default过滤器中会被评估为False
如果value是None,就使用default_if_none提供的默认值,例如:
{{ value|default_if_none:"nothing" }}如果value等于"",即空字符串,以上代码会输出空字符串,只有当value为None时,以上代码才会输出nothing。
该过滤器将返回列表/元组/字符串中的第一个元素,例如:
{{ value|first }}上述代码中,如果value为['a','b','c'],那么将返回a。
该过滤器将返回列表/元组/字符串中的最后一个元素,示例代码如下:
{{ value|last }}如果value是等于['a','b','c'],那么将返回c。
该过滤器类似于Python中的join函数,将列表/元组/字符串用指定的字符进行拼接,例如:
{{ value|join:"-" }}如果value是等于['a','b','c'],那么将返回a-b-c。
该过滤器将获取列表/元组/字符串/字典的长度,例如:
{{ value|length }}如果value是等于['a','b','c'],那么将返回3;如果value为None,那么将返回0。
该过滤器将value中所有的字符全部转换成小写,例如:
{{ value|lower }}如果value等于Hello World,那么将输出hello world。
该过滤器类似于lower,只不过是将指定的字符串全部转换成大写。
该过滤器可以在列表/字符串/元组中随机的选择一个值,例如:
{{ value|random }}如果valued等于['a','b','c'],那么Django将会在a, b, c中随机选择一个返回。
该过滤器类似于Python中的切片操作,例如:
{{ some_list|slice:"2:" }}以上代码将会将some_list从2开始做切片操作。
该过滤器会删除字符串中所有的html标签,例如:
{{ value|striptags }}如果value是<strong>hello world</strong>,那么将会输出hello world。
如果字符串value的长度超过了该过滤器指定的长度,那么就会进行切割,并且会拼接三个点来作为省略号,例如:
{{ value|truncatechars:5 }}如果value等于北京欢迎您~,那么输出的结果是北京...
这就奇怪了,为什么输出结果不是北京欢迎您…呢?
这是因为,三个点也占了三个字符,北京+ ... 的字符长度为5,所以是北京...
当字符串vlaue的长度没有超过该过滤器指定的长度,那么将不进行切割,例如:
{{ "马鞍山"|truncatechars:5 }}上述代码的输出结果依然是马鞍山
该过滤器类似于truncatechars,只不过不会切割html标签,例如:
{{ value|truncatechars:5 }}如果value是等于<p>北京欢迎您~</p>,那么输出的是<p>北京...</p>。