Python · 1 分钟阅读
模板语言
DTL 由 变量
{{ }}、标签{% %}、过滤器|、注释{# #}组成。
变量与方法调用
{{ user.username }}
{{ topic.created_time|date:"Y-m-d" }}
为了安全,DTL 默认禁止调用带"副作用"的方法。需要主动开放:
class A:
def z(self): return "Django"
z.alters_data = True
for 循环
{% for item in items %}
{{ forloop.counter }} - {{ item }}
{% empty %}
暂无数据
{% endfor %}
forloop 常用属性:
| 属性 | 含义 |
|---|---|
counter |
从 1 计数 |
counter0 |
从 0 计数 |
revcounter |
剩余元素数 |
first / last |
是否首/末项 |
parentloop |
嵌套时引用外层 |
url 标签
{% url 'post:topic_detail' topic.id %}
永远不要在模板里硬编码 URL。
comment 多行注释
{% comment %}
这段内容不会输出
{% endcomment %}
条件判断
{% if user.is_authenticated %}
Hi, {{ user.username }}
{% elif perms.post.add_topic %}
Hi, editor
{% else %}
Hi, guest
{% endif %}
Django 4.x 起
ifequal/ifnotequal已被弃用,直接用{% if a == b %}即可。
过滤器
用 | 把数据加工后再输出:
{{ name|lower }}
{{ text|truncatewords:30 }}
{{ value|default:"未知" }}
{{ items|length }}
{{ html|safe }} {# 标记为安全,不转义 #}
safe慎用!永远是潜在 XSS 风险点。
模板继承
<!-- base.html -->
<html>
<body>
{% block content %}{% endblock %}
</body>
</html>
<!-- child.html -->
{% extends "base.html" %}
{% block content %}
<h1>{{ page_title }}</h1>
{{ block.super }} {# 保留父 block 内容 #}
{% endblock %}
子模板的
{% extends %}必须是第一个模板标签。