云驹博客

路漫漫其修远兮,吾将上下而求索。

0%

Django模板语法

模板变量

模板变量的作用是计算并输出,变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。

语法如下:

1
2
3
4
{{ 模板变量名 }}
使用字典属性:{{ dict.title }}
使用列表元素:{{ list.1 }}
使用对象属性:{{ obj.title }}

当模版引擎遇到点如book.title,会按照下列顺序解析:

  1. 字典book['title']

  2. 先属性后方法,将book当作对象,查找属性 title,如果没有再查找方法 title()

  3. 如果是格式为book.0则解析为列表book[0]

  4. 如果变量不存在则插入空字符串’’。

在模板中调用方法时不能传递参数。

for循环

1
2
3
4
5
6
{% for item in 列表 %}
循环逻辑
{{forloop.counter}}表示当前是第几次循环,从1开始
{% empty %}
列表为空或不存在时执行此逻辑
{% endfor %}

if判断

1
2
3
4
5
6
7
{% if ... %}
逻辑1
{% elif ... %}
逻辑2
{% else %}
逻辑3
{% endif %}

运算符

比较运算符

1
2
3
4
5
6
==
!=
<
>
<=
>=

比较运算符两边必须有空格

布尔运算符:

1
2
3
and
or
not

运算符左右两侧不能紧挨变量或常量,必须有空格。

过滤器

格式:模板变量|过滤器:参数

1
2
3
4
5
{{ date|date:'Y年-m月-d日' }}  {# 日期格式 #}
{{ list|length }} {# 字符串和列表的长度 #}
{{ value|default:'默认值' }} {# 如果变量解析为假的话,使用default值填充 #}
{{ value|add:'2' }} {# 把add后的参数加给value,过滤器首先会强制把两个值转换为Int类型,如果转换失败,它会试图使用各种方式把两个值相加。它会使用一些数据类型(字符串,列表 等等)其他类型则会失败 #}
{{ htmlStr|safe }} {# 关闭模板字符串转义 #}

自定义过滤器:

  1. 在你的应用下面新建 python package(python 包),名称为:templatetags
  2. 新建filters.py文件,名称随意
  3. filters.py内导入类from django.template import Library
  4. 创建register = Library()类的对象
  5. 自定义过滤器函数需在函数上方使用@register.filter装饰函数
  6. 定义好过滤器后,在模板文件中引入自定义过滤器{% load filters %}
1
2
3
4
5
6
7
8
9
10
11
12
13
# 自定义过滤器
# 过滤器其实就是python函数
from django.template import Library

# 创建一个Library类的对象
register = Library()


@register.filter
def my_filter(num):
``` 判断num是否为偶数 ```
return num % 2 == 0

1
2
3
4
5
6
7
<html>
{% load filters %}
<head>
</head>
<body>
</body>
</html>

自定义过滤器参数,最少一个,最多两个

注释

单行注释语法如下

1
{#...#}

注释可以包含任何模版代码,有效的或者无效的都可以。

1
{# { % if foo % }bar{ % else % } #}

多行注释使用 comment 标签,语法如下:

1
2
3
{%comment%}
...
{%endcomment%}

模板标签

1
2
3
{% autoescape off %}  {# 关闭模板字符串转义 #}
模板语言代码
{% endautoescape %}

模板继承

典型应用:网站的头部、尾部信息。

父模板:

标签 block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。 为了更好的可读性,建议给 endblock 标签写上名字,这个名字与对应的 block 名字相同。父模板中也可以使用上下文中传递过来的数据。

1
2
3
{% block 名称 %}
预留区域,可以编写默认内容,也可以没有默认内容
{% endblock 名称 %}

子模板:

标签 extends:继承,写在子模板文件的第一行。

子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值。

1
2
3
4
5
6
{% extends "父模板路径" %}

{% block 名称 %}
{{ block.super }}用于获取父模板中block的内容
实际填充内容
{% endblock 名称 %}