2018-05-29-Django-03模板变量及模板过滤器

本文详细介绍了Django模板的路径配置、模板变量的使用规则,包括字典、模型、方法和函数的引用。同时,重点讲解了模板过滤器的概念和作用,演示了如何使用date和time过滤器格式,并给出了过滤器链式调用和参数使用的实例。此外,还提及了Django模板的自动转义机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板路径

在配置文件setting.py中找到TEMPLATES设置来配置。

这是一个设置选项的列表,模板大都包含两项通用设置;两种方式配置模板:

第一种: DIRS 定义一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件。将templates放在主项目目录下.

第二种: APP_DIRS告诉模板引擎是否应该进入每个已安装的应用中查找模板,值为True则模板会去安装了的app下面的templates文件夹查找模板。。所以我们也可以在每个app的里面创建模板目录templates存放模板,这种方式需要将这个app添加到setting.py文件的INSTALLED_APPS列表中.

模板变量

1、语法:{{变量名}}

2、命名由字母和数字以及下划线组成,不能有空格和标点符号。

3、可以使用字典、模型、方法、函数、列表。

4、不要和python或django关键字重名。

原因:如果data是一个字典,那么访问data.items将会访问data这个字典的key名为items的值,而不会访问字典的items方法。

5.变量和查找

点在模板渲染时有特殊的含义。 变量名中点表示查找。 具体一点,当模板系统遇到变量名中的一个点时,它会按下面的顺序进行查找:字典查找,属性查找,列表索引查找。

模板变量的例子:
{# /templates/books/index.html #}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    这个变量是字符串对象:{{ books_name}}<br>
    这个变量是函数对象:{{ hello}}<br>
    这个变量是类方法对象:{{ fruits_say}}<br>
    这个变量是类对象:{{ fruits}}<br>
    这个变量是类对象,访问类对象的属性:{{ fruits.name}}<br>
    这个变量是类对象,访问类对象的方法:{{ fruits.say}}<br>
    这个变量是列表对象{{ list }}<br>
    这个变量是列表对象,访问列表的元素{{ list.1 }}<br>
    这个变量是字典对象{{ dict }}<br>
    这个变量是字典对象,访问字典的键{{ dict.a }}<br>
</body>
</html>
# books/views.py
def hello():
    return 'django'

class Fruits:
    def __init__(self, name, color):
        self.name = name
        self.color = color
    def say(self):
        return 'HAHAHAHA'  
    
ap = Fruits('apple','red')
ls = ['x','y','z']
dc =  {'a':1,'b':2}
from django.shortcuts import render
def index_5(request,bn):
    return render(request,'books/index.html',
                  context={'books_name':'python',#字符串
                           'hello':hello,        # 函数
                           'fruits_say':ap.say,  # 方法
                           'fruits':ap,          # 类对象
                           'list':ls,            # 列表
                           'dict':dc,            # 字典
                           }) 

Django模板过滤器

知识点:

  1. 基本概念
  2. 常用的过滤器
  3. 过滤器例子
  4. 关于自动转义
模板过滤器

作用:对变量进行过滤。在真正渲染出来之前,过滤器会根据功能处理好变量,然后得出结果后再替换掉原来的变量展示出来。

语法:{{fruits|lower}}

管道符号进行链式调用,比如实现一个功能,先把所有字符变成小写,把第一个字符转换成大写。

语法:{{fruits|lower|capfirst}}

使用参数:过滤器可以使用参数,在过滤器名称后面使用冒号”:”再加上参数,比如要把一个字符串中所有的空格去掉,则可以使用cut过滤器,

语法如下: {{fruits|cut:" "}}
注意:使用参数的时候,冒号和参数之间不能有任何空格,一定要紧挨着。

过滤器参数,可以使用变量.
字符串相加,数字相加,列表相加,如果失败,将会返回一个空字符串。

Django常用的过滤器
1、 add :字符串相加,数字相加,列表相加,如果失败,将会返回一个空字符串。
2、default:提供一个默认值,在这个值被django认为是False的时候使用。比如:空字符串、None。区别于default_if_none,这个只有在变量为None的时候才使用默认值。
3、first:返回列表中的第一个值。
4、last:返回列表中的最后一个值。
5、date:格式化日期和时间。
6、time:格式化时间。
7、join:跟python中的join一样的用法。
8、length:返回字符串或者是数组的长度。
9、length_is:字符串或者是数组的长度是否是指定的值。
10、lower:把所有字符串都编程小写。
11、truncatechars:根据后面给的参数,截断字符,如果超过了用…表示。
12、truncatewords:同truncatechars,这个是以一个单词为单位进行截断。
以上两个有xxx_html类型的,针对html,截断标签中的字符,而不会截断标签。
13、capfirst:首字母大写。
14slice:切割列表。用法跟python中的切片操作是一样的,区间是前闭合后开放。
15、striptags:去掉所有的html标签。
16、safe:关闭变量的自动转义
17、floatformat:浮点数格式化。
date和time过滤器格式
Y:四位数的年。如:1999
y:两位数的年。如:99
m:两位数的月。如:0109
n:一位数的月。如:1912
d:两位数的日。如:01,09,31
j:一位数的日。如:1,9,31
g:12小时制的一位数的小时。如:1912
G:24小时制的一位数小时。如:0823
h:12小时制的两位数的小时。如:010912
H:24小时制的两位数的小时。如:01,13,24
i:分钟。从00-59
s:秒。从00-59
过滤器例子:

新建一个名为movie的APP.

#move/templates/move.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>这个变量是:字符串对象:{{name}}</p>
<p>这个变量是:函数对象:{{hello}}</p>
<p>这个变量是:类对象:{{fruits}}</p>
<p>这个变量是:类的实例对象:{{fruit}}</p>
<p>这个变量是:类的方法对象:{{fruits_say}}</p>
<p>这个变量是:实例的方法对象:{{fruit_say}}</p>
<p>这个变量是:类的属性对象:{{fruits_name}}</p>
<p>这个变量是:实例的属性对象:{{fruit_name}}</p>
<p>这个变量是:列表对象:{{lis}}</p>
<p>这个变量是:字典对象:{{dic}}</p>
</body>	
</html>
访问http://39.105.77.167:8000/move/
输出结果:

这个变量是:字符串对象:None

这个变量是:函数对象:django

这个变量是:类对象:

这个变量是:类的实例对象:<move.views.Fruits object at 0x7f8e9bfca0f0>

这个变量是:类的方法对象:

这个变量是:实例的方法对象:class object

这个变量是:类的属性对象:{}

这个变量是:实例的属性对象:apple

这个变量是:列表对象:[1, 2, 3, 4, 5]

这个变量是:字典对象:{'a': 1, 'b': 2, 'c': 3}
#move/views.py

from django.shortcuts import render
from django.http import HttpResponse
from datetime import datetime
# Create your views here.


def hello():
    print("running hello function")
    return 'django'

class Fruits(object):
    truncate = {}
    def __init__(self,name,color):
        self.name = name
        self.color = color
    def say(self):
        print("我被直接调用了")
        return "class object"

fruit = Fruits("apple","red")

lis = [1,2,3,4,5]
dic = dict(a=1,b=2,c=3)
now = datetime.now

def move(request):
    name = request.GET.get("name",None)
    age = request.POST.get("age",None)
    # print("-->",Fruits.truncate)
    # print(fruit)
    # return HttpResponse("move is %s"%(name))
    a = 4
    b = 2
    return render(request,"move.html",{
        "name":name,
        "hello":hello,
        "fruits":Fruits,
        "fruit":fruit,
        "fruits_say":Fruits.say,
        "fruit_say":fruit.say,
        "fruits_name":Fruits.truncate,
        "fruit_name":fruit.name,
        "lis":lis,
        "dic":dic,
        'a': a,
        'b': b,
    })
#------------------------------------------------------


ls = ['x','y','z']
def hello1(request):
    test = 'this is a list'
    xx = ""
    yy = None
    zz = "pretty Amazing"
    num1 = 1
    num2 = 2
    print("now is:", now)
    html = "<h1>hello django!!!</h1>"
    float = 3.1415926

    return render(request,"filtration.html",{
        'test':test,
        'xx':xx,
        'yy':yy,
        'zz':zz,
        'num1':num1,
        'num2':num2,
        'ls':ls,
        'now':now,
        'html':html,
        'float':float,
    })
#move/templates/filtration.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板过滤</title>
</head>
<body>
    <p>这是没做处理的变量:{{test}}</p>
    <p>这是设置了默认值的变量:{{xx|default:"default"}}</p>
    <p>这是设置了只有为None时才使用默认值的变量:{{yy|default_if_none:"if none set default"}}</p>
    <p>这是设置了lower过滤的变量:{{zz|lower}}</p>
    <p>这是先变成小写再将首字母大写后的变量:{{zz|lower|capfirst}}</p>
    <p>这是两个数字{{num1}}和{{num2}}变量相加:{{num1|add:num2}}</p>
    <p>这是两个字符串{{test}}和{{zz}}变量相加:{{test|add:zz}}</p>
    <p>这是列表变量的第一个元素:{{ls|first}}</p>
    <p>这是列表变量的最后一个元素:{{ls|last}}</p>
    <p>这是默认的data日期时间格式:{{now|date}}</p>
    <p>这是默认的time时间格式:{{now|time}}</p>
    <p>这是data过滤器的年月日24小时制时间格式:{{now|date:'Y/m/d/H:i:s'}}</p>
    <p>这是time过滤器的年月日12小时制时间格式:{{now|time:'h:i:s'}}</p>
    <p>这是字符串的join方法:{{ls|join:'***'}}</p>
    <p>这是字符串的长度方法:{{test|length}}</p>
    <p>这是列表的长度是否长度为4:{{ls|length_is:4}}</p>
    <p>这是字符串只显示4个字符,其余省略(占3位):{{test|truncatechars:7}}</p>
    <p>这是字符串只显示2个单词,其余省略(不占位):{{test|truncatewords:2}}</p>
    <p>这是字符串切片0~4:{{test|slice:"0:4"}}</p>
    <p>这是列表切片0~2:{{ls|slice:"0:2"}}</p>
    <p>这是含html标签的字符串:{{html}}</p>
    <p>这是去掉字符串中的html标签:{{html|striptags}}</p>
    <p>这是关掉自动转义,使字符串中html标签生效:{{html|safe}}</p>
    <p>这是没做处理的小数:{{float}}</p>
    <p>这是保留了一位小数:{{float|floatformat}}</p>
    <p>这是保留了两位小数:{{float|floatformat:'2'}}</p>
</body>
</html>
访问http://39.105.77.167:8000/move/filtration/
输出结果:

这是没做处理的变量:this is a list

这是设置了默认值的变量:default

这是设置了只有为None时才使用默认值的变量:if none set default

这是设置了lower过滤的变量:pretty amazing

这是先变成小写再将首字母大写后的变量:Pretty amazing

这是两个数字1和2变量相加:3

这是两个字符串this is a list和pretty Amazing变量相加:this is a listpretty Amazing

这是列表变量的第一个元素:x

这是列表变量的最后一个元素:z

这是默认的data日期时间格式:May 30, 2018

这是默认的time时间格式:2:40 a.m.

这是data过滤器的年月日24小时制时间格式:2018/05/30/02:40:59

这是time过滤器的年月日12小时制时间格式:02:40:59

这是字符串的join方法:x***y***z

这是字符串的长度方法:14

这是列表的长度是否长度为4:False

这是字符串只显示4个字符,其余省略(占3位):this...

这是字符串只显示2个单词,其余省略(不占位):this is ...

这是字符串切片0~4:this

这是列表切片0~2:['x', 'y']

这是含html标签的字符串:<h1>hello django!!!</h1>

这是去掉字符串中的html标签:hello django!!!

这是关掉自动转义,使字符串中html标签生效:

hello django!!!
这是没做处理的小数:3.1415926

这是保留了一位小数:3.1

这是保留了两位小数:3.14
关于自动转义
什么是自动转义?
自动转义是将变量的一些特殊字符,比如左箭头(<)、右箭头(>)转义成html代码,这样做的目的是为了处理一些不安全的变量。
<:转义成&lt;
>:转义成&gt;
‘:转义成&#39;
“:转义成&quot;
&:转义成&amp;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值