likes
comments
collection
share

Django模板系统

作者站长头像
站长
· 阅读数 25

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

Django模板基本语法

Django模板系统主要涉及模板变量、过滤器、模板标签等。

  • 模板变量形如{{ name}},{{}}内为一个变量名

  • 过滤器主要是对模板变量进行处理,如改变显示方式

  • 模板标签形如{% name%},{%%}内是一个与逻辑相关的名字

模板文件

Django中的模板文件是HTML文件

常规情况下我们会在项目根目录(即manage.py文件所在目录)下建立一个名为templates的文件夹,用来存放我们的模板文件。

在settings.py文件的TEMPLATES代码块中设置模板文件所在路径,DIRS就是设置模板文件路径的地方

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 定义一个目录列表,模板引擎按顺序在其中查找模板文件
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        # APPS_DIRS为True就查找,False就不查找
        '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',
            ],
        },
    },
]

模板变量

模板变量的格式为{{ name }},其中name表示变量名,name两侧都要有一个空格,变量名可以由字母、数字以及下划线组成,不能包含空格或标点符号。

模板变量内嵌在HTML文件中,当Django模版引擎检测到一个模板变量时,它会用变量代表的实际值或内容进行替换。

在模板变量中,有变量名后加点“.”再加字符串的形式,Django模版引擎会根据变量的不同情况进行解析。如果是字典变量则按字典形式查询key值;如果是类对象变量则按属性或方法查询;如果是列表变量则按索引数字查询。

例子:

视图

def test(request):
    a='测试'
    b={'n':'测试字典'}
    return render(request,'test.html',{'a':a,'b':b})

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>{{ a }}</h1>
<h1>{{ b.n }}</h1>

</body>
</html>

Django模板系统

模板注释

模板语言中也可以使用注释,如{# ××× #}

单行注释形式如下。
{# 这里写注释 #}
多行注释要使用注释标签。
{% comment %}
  ........
{% endcomment %}

过滤器

通过过滤器对模板变量进行再“加工”改变模板变量的形式或内容

{{ name|filter_name:参数 }}

管道符“|”右边就是过滤器名字

过滤器可以传递参数,过滤器名字与参数用“:”分隔

在过滤器格式中,管道符“|”前面的变量与“:”后面的参数都将作为参数传给过滤器处理

内置过滤器

常用过滤器

  • 过滤器default,格式为{{ name|default:"默认值"}},如果模板变量的值为空或False,就显示默认值。

  • 过滤器length,格式为{{ name|length }},显示模板变量的长度。

  • 过滤器truncatechars,格式为{{ name|truncatechars:6 }},适用于模板变量是字符串的情况,显示指定的字符个数,后面以省略号“...”结尾,“...”算为3个字符。例如传入的参数为6个字符时,从字符串中截取3个字符,后面加“...”。

  • 过滤器upper和lower,{{ name |upper }}将字符串转换为全部大写的形式;{{ name|lower }}将字符串转换为全部小写的形式。

  • 过滤器slice,格式为{{ name|slice:":2"}},用于模板变量是列表或字符串的情况,显示其中的一部分,也就是切片,与Python切片的语法相同。

  • 过滤器date,格式为{{ name|date:"Y-m-d H:i:s"}},用于模板变量是日期或时间的情况,提供格式化输出。

  • 过滤器safe,格式为{{ name|safe }},为了安全,Django的模板会对HTML标签和Java Script代码等语法标签进行自动转义(转成纯文本字符串),过 滤器safe则会关闭自动转义功能

例子:

视图

def test(request):
    a='测试'
    b='<h1>123<h1>'
    c='abcABC'
    time=datetime.datetime.now()
    return render(request,'test.html',{'a':a,'b':b,'c':c,'time':time})

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<H1>{{ c|length }}</H1>
<H1>{{ c|truncatechars:2 }}</H1>
<H1>{{ c|upper }}</H1>
<H1>{{ c|lower }}</H1>
<H1>{{ c|slice:"2:5" }}</H1>
<H1>{{ c|date:"Y-m-d H:i:s" }}</H1>
<H1>{{ b }}</H1>
<H1>{{ b|safe}}</H1>


</body>
</html>

Django模板系统

模板标签

内置模板标签

模板标签if

用于判断,虽然它放在HTML文件中,但其语法与Python代码语法非常相似。{% if %}为真,模板系统就显示{% if %}和{% endif %}之间的内容。模板标签if可以包含{% else %}、{% elif %}子句。

{% if a>0 %}
	a>0
{% elif a<0 %}
	a<0
{% else %}
	a=0
{% endif %}

模板标签ifequal和ifnotequal

一个用于判断两个值是否相等,一个用于判断两个值是否不相等。

{% ifequal a 0 %}
	a=0
{% endifequal %}
{% ifnotequal a 0 %}
	a!=0
{% endifnotequal %}

for循环模板标签

与Python代码语法相似,{% for %}用于循环可迭代变量,每次循环时显示{% for %}和{% endfor %}之间的内容。

{% empty %} #判断列表是否为空

设有一个列表变量lists

lists=[{'naem':1},{'naem':2},{'naem':3},{'naem':4},]
使用for循环模板标签遍历lists列表

{% for user in lists%}
{{ user.name}}
{% empty %} #判断列表是否为空
 无数据
{% endfor %}

for循环标签的内置参数

●forloop.counter:从1开始返回当前循环的索引值。
●forloop.counter0:从0开始返回当前循环的索引值。
●forloop.revcounter:返回当前循环的倒序索引值,从最大索引值起始,最后到值1。●forloop.revcounter0:返回当前循环的倒序索引值,从最大索引值起始,最后到值0。
●forloop.first:返回布尔值,表示当前循环是不是第一次循环。
●forloop.last:返回布尔值,表示当前循环是不是最后一次循环。
●forloop.parentloop:本层循环的外层循环(父循环)。

例子:

{% for user in lists%}
第{{ forloop.counter }}个name是:
{{ user.name}}
{% empty %} #判断列表是否为空
 无数据
{% endfor %}