Django框架之模版过滤器详解及人性化过滤器

前言

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

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

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

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

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

过滤器

除了模板标签可以帮助我们对数据或者进行逻辑处理;django中还提供了一款工具叫做过滤器,过滤器也可以实现一些模板变量的运算,判断或是其他逻辑处理

add

{
   
   { var1|add:var2 }}

add过滤器可以实现var1var2的相加,并且在遇到其他相同数据类型的,比如列表时,加号还可以重载为拼接功能

过滤器首先会将数据转换成Int类型,进行相加,如果转换失败,则会尝试使用Python中的数据类型;列表、元祖等这样的数据类型来进行转换,并且执行对应类型的加法;如果都转换失败,那么结果为一个空字符串

<p>add :{
   
   { value|add:10 }}</p>
<p>add :{
   
   { list_1|add:list_2 }}</p>  

capfirst

{
   
   { var|capfirst }}

将变量第一个字母变为大写,如果第一个字符不是字母,过滤器不生效

<p>capfirst:{
   
   { "Abc"|capfirst }}</p>
<p>capfirst:{
   
   { "1abc"|capfirst }}</p>

center

{
   
   { value|center:"length" }}

使value在给定的length范围内居中

<p>center: {
   
   { "abc"|center:"10" }}</p>

cut

{
   
   { value|cut:"str" }}

value中移除所有str

<p>cut: {
   
   { "a*b*c"|cut:"*" }}</p>

date

{
   
   { value|date:SHORT_DATE_FORMAT" }}

{% now %}标签所使用格式字符一致;value为一个datetime对象,输出最终格式与项目时区及语言设置有关

import datetime
datetime = datetime.datetime.now()
<p>date: {
   
   { datetime|date:"H:i" }}</p>
<p>date: {
   
   { datetime|date:"Y/m/d" }}</p>

default

{
   
   { value|default:"默认值" }}

如果value值为假,则取"默认值",反之返回value

<p>default: {
   
   { 0|default:"这是展示的默认值" }}</p>

非空非0为真,0或空为假


default_if_none

{
   
   { value|default_if_none:"默认值" }}

如果value值为None,则取"默认值",反之返回value

<p>default_if_none: {
   
   { None|default_if_none:"value值为None" }}</p>
<p>default_if_none: {
   
   { 0|default_if_none:"aaaa" }}</p>

dictsort

{
   
   { value|dictsort:"attr" }}

value为字典列表数据,列表中数据均为类字典数据:[ {1:'a'}, {2:'b'}, ]

根据给定attr值进行排序,一般是从小到大的顺序

sort_list_dict = [
    {
    
    'name': '小绿', 'department': 'Development', 'age': 32},
    {
    
    'name': '小红', 'department': 'Leader', 'age': 21},
    {
    
    'name': '小飞', 'department': 'Test', 'age': 18},
    {
    
    'name': '小落', 'department': 'Development', 'age': 15},
    {
    
    'name': '大胖', 'department': 'Leader', 'age': 43}
]
<p>dictsort: </p>
{% for var in sort_list_dict|dictsort:"age" %}
    <p>
        {
   
   { var.name }} 
    </p>
{% endfor %}

dictsortreversed

{
   
   { value|dictsortreversed:"attr" }}

dictsort功能相同,但是排序方式与dictsort相反,从大到小


divisibleby

{
   
   { value|divisibleby:num }}

如果给定的value可以被num整除,返回True;反之,返回False,这个过滤器常用来做整除判断

<p>divisibleby: {
   
   { 8|divisibleby:2 }}</p>

escape

{
   
   { value|escape }}

将value值转义输出;可以在取消转义autoescape标签下,选择性的打开某些需要转义的数据

{% autoescape off %}
    {
   
   { str_|escape }}
    {
   
   { str_ }}
{% endautoescape %}

safe

{
   
   { value|safe }}

取消转义,与{% autoescape off %}标签意义相同

<p>{
   
   { str_|safe }}</p>

safeseq

{
   
   { value|safeseq }}

处理一个包含标签字符串的列表数据,简单的safe是不行的,因为safe过滤器会把内容先整体处理为字符串;而不是依次过滤序列中的数据,而safeseq过滤器则会依次处理序列中的每一个数据

list_ = [
    "<h1>第一个</h1>",
    "<h2>第二个</h2>",
    "<h3>第三个</h3>",
]
{
   
   { list_|safe|join:"" }}
<br>
------------------
<br>
{
   
   { list_|safeseq|join:"" }}

filesizeformat

{
   
   { value|filesizeformat }}

格式化value值为人类可读的计算机存储单位。如:1 bytes、1.2 MB;如果不是一个可以处理的数值类型,返回0。最小单位为byte

<p>filesizeformat : {
   
   { "1"|filesizeformat }}</p>
<p>filesizeformat : {
   
   { "3758331"|filesizeformat }}</p>

first

{
   
   { value|first }}

返回序列数据value中的第一项

<p>first : {
   
   { "abc"|first }}</p>

last

{
   
   { value|last }}

返回序列数据value中的最后一项

<p>last : {
   
   { "abc"|last }}</p>

floatformat

{
   
   { value|floatformat:"精度" }}

设置浮点数value的精度,没有参数时,默认四舍五入保留小数点后一位

<p>floatformat : {
   
   { "2.2332"|floatformat:"2" }}</p>
<p>floatformat : {
   
   { "2.2550"|floatformat:"2" }}</p>
<p>floatformat : {
   
   { "2.0000"|floatformat:"2" }}</p>

join

{
   
   { value|join:"str" }}

将序列数据value通过str进行拼接

<p>join : {
   
   { "abc"|join:"*" }}</p>

length_is

{
   
   { value|length_is:"num" }}

判断序列value的长度是否为num,如果是,返回True,反之返回False

<p>length_is : {
   
   { "abc"|length_is:4 }}</p>
<p>length_is : {
   
   { "abcd"|length_is:4 }}</p>

linebreaksbr

{
   
   { value|linebreaksbr }}

将字符串value中的所有换行符\n转换为HTML换行符<br>

str_ = "abc\nbbb"
<p>linebreaksbr : {
   
   { str_|linebreaksbr }}</p>

linenumbers

{
   
   { value|linenumbers }}

显示value数据的行号,一般来说,是根据value字符串中的\n换行来确定每一行

str_ = "abc\nbbb"
<p>linenumbers :<br> {
   
   { str_|linenumbers }}</p>
<p>linenumbers :<br> {
   
   { str_|linenumbers|linebreaksbr }}</p>

ljust

{
   
   { value|ljust:"num" }}

将字符串value按照给定宽度num左对齐

<p>ljust : {
   
   {"test"|ljust:"10" }}</p>

HTML中空格是被忽略的,所以直观的我们并看不到这个过滤器的对齐效果;需要使用&nbsp才可以在HTML中展示真正的空格效果,这个操作会在之后的自定义过滤器中为大家介绍


rjust

{
   
   { value|rjust:"num" }}

将字符串value按照给定宽度num右对齐

<p>rjust : {
   
   { "test"|rjust:"10" }}</p>

lower

{
   
   { value|lower }}

将字符串value中的全部字符串小写

<p>rjust : {
   
   { "Aa123Bb"|lower }}</p>

upper

{
   
   { value|upper }}

将字符串value中的全部字符串大写

<p>upper : {
   
   { "Aa123Bb"|upper }}</p>

title

{
   
   { value|title }}

value字符串中每一个单词首字母大写,其余字符小写

<p>title : {
   
   { "heLLO a12b world"|title }}</p>

make_list

{
   
   { value|make_list }}

value转换为列表

<p>make_list : {
   
   { "a1好a2a"|make_list }}</p>
['a', '1', '好', 'a', '2', 'a']

random

{
   
   { value|random }}

返回value序列中的一个随机值

<p>random : {
   
   { "12345"|random }}</p>

slice

{
   
   { value|slice:"start:stop:step" }}

Python中序列切片用法类似,取出一定范围内的数据

<p>slice : {
   
   { "abcdef"|slice:"0:5" }}</p>
<p>slice : {
   
   { "abcdef"|slice:"0:6" }}</p>
<p>slice : {
   
   { "abcdef"|slice:"0:6:2" }}</p>

time

{
   
   { value|time:"time_format" }}

date过滤器类似,但该过滤器只处理时、分、秒;

根据时间格式化字符输出时间,输出最终格式与项目时区及语言设置有关

import datetime
datetime = datetime.datetime.now()
<p>time: {
   
   { datetime|time:"H:i" }}</p>
<p>time: {
   
   { datetime|time:"Y/m/d" }}</p>

timesince

{
   
   { start_time|timesince:end_time }}

计算从start_time一直到end_time的时间间隔,end_time为可选,没有该值,截至从当前时间开始

分钟为返回最小单位

start_time = datetime.datetime(2019, 3, 3, 15)
end_time = datetime.datetime(2019, 3, 5, 17)
<p>time : {
   
   { start_time|timesince:end_time }}</p
<p>time : {
   
   { start_time|timesince }}</p>
time : 2 days, 2 hours
time : 3 weeks, 2 days

urlencode

{
   
   { value|urlencode }}

使用连接编码格式处理value

<p>urlencode : {
   
   { "http://example.com"|urlencode }}</p>
urlencode : http%3A//example.com

urlize

{
   
   { value|urlize }}

使连接字符串value变为可点击的a标签连接

<p>urlize : {
   
   { "http://example.com"|urlize }}</p>
<p>urlize : {
   
   { "http://example.com" }}</p>

人性化过滤器

除去上面所介绍的过滤器,django还提供了一个专门人性化处理数据的过滤器组件;

使用时,需要将**‘django.contrib.humanize’**添加到settings.py文件中的INSTALLED_APPS属性中

之后在模板页面加载{% load humanize %}就可以使用到humanize中的人性化过滤器

apnumber

{
   
   { value|apnumber }}

将整数转化为字符串,并按照语言设置返回对应的数字表示方式

<p>intcomma : {
   
   { "3000"|intcomma }}</p> 
<p>intcomma : {
   
   { "23300"|intcomma }}</p>

intword

{
   
   { value|intword }}

将一个大型数字转换成友好的文字表达形式,适合超过100万的数字

<p>intword : {
   
   { "310100100"|intword }}</p>

naturalday

{
   
   { value|naturalday }}

返回value时间相对于今天。返回"今天",“明天"或者"昨天”

today = datetime.datetime.now()
<p>naturalday : {
   
   { today|naturalday }}</p>

naturaltime

{
   
   { value|naturaltime }}

获得value与当前时间的时间间隔,并使用合适的文字来描述;

如果超过一天间隔,将会使用timesice过滤器格式

start_time = datetime.datetime(2019, 3, 3, 15)
<p>naturalday : {
   
   { start_time|naturaltime }}</p>

猜你喜欢

转载自blog.csdn.net/HeroicLee/article/details/121361889