R / Richie全部文章 ↑

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 %} 必须是第一个模板标签。