学习笔记,仅供参考
参考自: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:
<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:
<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 | 四位数字的年份 | 2018 |
m | 两位数字的月份 | 01-12 |
n | 月份,1-9前面没有0前缀 | 1-12 |
d | 两位数字的天 | 01-31 |
j | 天,但是1-9前面没有0前缀 | 1-31 |
g | 小时,12小时格式的,1-9前面没有0前缀 | 1-12 |
h | 小时,12小时格式的,1-9前面有0前缀 | 01-12 |
G | 小时,24小时格式的,1-9前面没有0前缀 | 1-23 |
H | 小时,24小时格式的,1-9前面有0前缀 | 01-23 |
i | 分钟,1-9前面有0前缀 | 00-59 |
s | 秒,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 }}
如果value
d等于['a','b','c']
,那么Django将会在a
, b
, c
中随机选择一个返回。
该过滤器类似于Python
中的切片操作,例如:
{{ some_list|slice:"2:" }}
以上代码将会将some_list
从2
开始做切片操作。
该过滤器会删除字符串中所有的html
标签,例如:
{{ value|striptags }}
如果value
是hello world
,那么将会输出hello world
。
如果字符串value的长度超过了该过滤器指定的长度,那么就会进行切割,并且会拼接三个点来作为省略号,例如:
{{ value|truncatechars:5 }}
如果value
等于北京欢迎您~
,那么输出的结果是北京...
这就奇怪了,为什么输出结果不是北京欢迎您…呢?
这是因为,三个点也占了三个字符,北京
+ ...
的字符长度为5,所以是北京...
当字符串vlaue的长度没有超过该过滤器指定的长度,那么将不进行切割,例如:
{{ "马鞍山"|truncatechars:5 }}
上述代码的输出结果依然是马鞍山
该过滤器类似于truncatechars
,只不过不会切割html
标签,例如:
{{ value|truncatechars:5 }}
如果 北京欢迎您~ 北京...value
是等于
,那么输出的是
。