Django模板语法


一、变量(Variables)

用于展示视图传递的动态数据,语法:{{ 变量名 }}

核心特点:

  • 查找顺序:先查字典键(dict.key)→ 再查对象属性(obj.attr)→ 最后查列表索引(list.0
  • 特殊变量:模板中可直接使用部分内置上下文变量(需配置context_processors),如:
  • {{ request }}:当前请求对象(含method/path等属性)
  • {{ user }}:当前登录用户对象(含username/is_authenticated等属性)
  • {{ messages }}:消息框架的提示信息

示例:

<!-- 展示视图传递的user对象的username属性 -->
<p>用户名:{{ user.username }}</p>

<!-- 展示列表的第一个元素 -->
<p>第一个元素:{{ my_list.0 }}</p>

<!-- 展示字典的value -->
<p>年龄:{{ my_dict.age }}</p>

二、标签(Tags)

用于实现逻辑控制(循环、判断等)或模板复用,语法:{% 标签名 参数 %}(需闭合,如{% endif %}

1. 流程控制标签

  • if 条件判断支持比较运算符(==/!=/</>/<=/>=)、逻辑运算符(and/or/not)、in(包含)、is(身份判断)。

```html {% if score >= 90 %}

优秀

{% elif score >= 60 %}

及格

{% else %}

不及格

{% if "apple" in fruits %}

包含苹果

{% endif %} ```

  • for 循环遍历用于遍历列表、字典、QuerySet 等可迭代对象,配合forloop变量获取循环信息。

html {% for book in books %} <p>{{ forloop.counter }}. {{ book.title }}</p> <!-- counter:从1开始的序号 --> {% empty %} <!-- 迭代对象为空时执行 --> <p>暂无书籍</p> {% endfor %}

forloop常用属性:

  • counter:当前循环次数(从 1 开始)
  • counter0:当前循环次数(从 0 开始)
  • first:是否为第一次循环(True/False
  • last:是否为最后一次循环(True/False
  • parentloop:嵌套循环中,获取父循环的forloop对象

2. 模板复用标签

  • 模板继承(extends + block)实现模板复用,父模板定义可替换的 “块”,子模板重写块内容。

父模板(base.html):

```html
{% block title %}默认标题{% endblock %} {% block content %}{% endblock %}

```

子模板:

```html {% extends "base.html" %}

{% block title %}首页{% endblock %}

{% block content %}

欢迎访问首页

{{ block.super }} {% endblock %} ```

  • 包含(include)将其他模板片段嵌入当前模板,可传参数。

```html

{% include "header.html" with title="首页" is_login=True %} ```

3. 常用工具标签

  • {% csrf_token %}:在 POST 表单中添加 CSRF 令牌,防止跨站请求伪造(必须加!)

```html

{% csrf_token %}

```

  • {% url '路由别名' 参数 %}:根据 urls.py 中定义的name生成 URL,避免硬编码

```html

查看第10本书 ```

  • {% static '静态文件路径' %}:生成静态文件(CSS/JS/ 图片)的 URL,需先加载 static 标签库

html {% load static %} <!-- 加载静态文件标签库 --> <link rel="stylesheet" href="{% static 'css/style.css' %}"> <img src="{% static 'images/logo.png' %}">

  • {% load 标签库名 %}:加载自定义标签库或第三方标签库(如static属于django.contrib.staticfiles的标签库)

4. 注释标签

  • 单行注释:{# 注释内容 #}(不会被渲染到 HTML)
  • 多行注释:{% comment %} 多行注释内容 {% endcomment %}

三、过滤器(Filters)

用于对变量进行处理(格式化、转换等),语法:{{ 变量|过滤器:参数 }}(可链式调用:{{ var|filter1|filter2 }}

常用过滤器:

过滤器 作用 示例
lower 转小写 {{ "HELLO" | lower }}hello
upper 转大写 {{ "hello" | upper }}HELLO
truncatechars:n 截断为 n 个字符(含省略号... {{ "abcdefg" | truncatechars:5 }}ab...
truncatewords:n 截断为 n 个单词(按空格分割) {{ "I like Django" | truncatewords:2 }}I like ...
date:"格式" 日期格式化(参考 Python strftime) {{ now | date:"Y-m-d H:i:s" }}2023-10-01 12:30:00
default:默认值 变量为空 / None 时显示默认值 {{ age | default:"未知" }}
length 返回变量长度(字符串 / 列表等) {{ ["a", "b"] | length }}2
join:分隔符 用分隔符拼接列表元素 {{ ["a", "b"] | join:", " }}a, b
safe 标记为安全内容(不转义 HTML) {{ html_str | safe }}(谨慎使用,防 XSS)

四、注意事项

  1. 模板语法不支持直接写 Python 代码(如for i in range(10)),逻辑需在视图中处理。
  2. 变量不存在时,模板默认不显示(可通过default过滤器处理)。
  3. safe过滤器需谨慎使用:若内容含用户输入,可能导致 XSS 攻击。
  4. 模板上下文由视图通过render(request, 'tpl.html', context)传递(context是字典)。

0 条评论

发表评论

暂无评论,欢迎发表您的观点!