Django模板标签
外观
Django模板标签[编辑 | 编辑源代码]
Django模板标签是Django模板系统(Template System)的核心组成部分之一,用于在HTML模板中嵌入动态逻辑。它们允许开发者执行条件判断、循环迭代、变量赋值等操作,而无需在视图中处理所有逻辑。模板标签通常由大括号和百分号包围,例如{% tag %}
。
基本语法[编辑 | 编辑源代码]
Django模板标签的基本语法结构如下:
{% tag_name arguments %}
其中:
tag_name
是标签的名称(如if
、for
等)。arguments
是可选的参数或表达式,具体取决于标签的功能。
常用模板标签[编辑 | 编辑源代码]
条件判断:{% if %}
[编辑 | 编辑源代码]
{% if %}
标签用于在模板中进行条件判断,类似于Python中的if
语句。
示例[编辑 | 编辑源代码]
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}!</p>
{% else %}
<p>Please log in.</p>
{% endif %}
输出[编辑 | 编辑源代码]
- 如果用户已登录,显示欢迎消息。
- 如果用户未登录,提示登录。
循环迭代:{% for %}
[编辑 | 编辑源代码]
{% for %}
标签用于遍历可迭代对象(如列表、查询集等)。
示例[编辑 | 编辑源代码]
<ul>
{% for item in items %}
<li>{{ item.name }}</li>
{% empty %}
<li>No items available.</li>
{% endfor %}
</ul>
输出[编辑 | 编辑源代码]
- 如果
items
不为空,渲染每个项目的名称。 - 如果
items
为空,显示“No items available”。
变量赋值:{% with %}
[编辑 | 编辑源代码]
{% with %}
标签用于在模板中临时赋值变量,避免重复计算或访问复杂表达式。
示例[编辑 | 编辑源代码]
{% with total=items|length %}
<p>Total items: {{ total }}</p>
{% endwith %}
输出[编辑 | 编辑源代码]
显示items
的长度。
模板继承:{% extends %}
和 {% block %}
[编辑 | 编辑源代码]
Django的模板继承机制允许创建基础模板(父模板)并在子模板中覆盖特定部分。
父模板(base.html)[编辑 | 编辑源代码]
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
子模板(child.html)[编辑 | 编辑源代码]
{% extends "base.html" %}
{% block title %}Custom Title{% endblock %}
{% block content %}
<p>This is the child template content.</p>
{% endblock %}
输出[编辑 | 编辑源代码]
子模板继承父模板的结构,并覆盖title
和content
块。
高级模板标签[编辑 | 编辑源代码]
自定义标签[编辑 | 编辑源代码]
开发者可以创建自定义模板标签以扩展功能。自定义标签需要:
1. 在templatetags
目录中创建Python模块。
2. 使用@register.simple_tag
或@register.inclusion_tag
装饰器注册标签。
示例:自定义标签[编辑 | 编辑源代码]
# myapp/templatetags/custom_tags.py
from django import template
register = template.Library()
@register.simple_tag
def current_time(format_string):
from datetime import datetime
return datetime.now().strftime(format_string)
在模板中使用[编辑 | 编辑源代码]
{% load custom_tags %}
<p>Current time: {% current_time "%Y-%m-%d %H:%M:%S" %}</p>
输出[编辑 | 编辑源代码]
显示当前时间,格式为YYYY-MM-DD HH:MM:SS
。
过滤器标签:{% filter %}
[编辑 | 编辑源代码]
{% filter %}
标签用于对块内的内容应用过滤器。
示例[编辑 | 编辑源代码]
{% filter upper %}
This text will be uppercase.
{% endfilter %}
输出[编辑 | 编辑源代码]
THIS TEXT WILL BE UPPERCASE.
实际应用案例[编辑 | 编辑源代码]
分页显示[编辑 | 编辑源代码]
使用{% for %}
和条件判断实现分页逻辑。
<div class="pagination">
{% if page_obj.has_previous %}
<a href="?page=1">First</a>
<a href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}
<span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">Next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">Last</a>
{% endif %}
</div>
动态导航菜单[编辑 | 编辑源代码]
根据用户权限显示不同的导航项。
<ul>
<li><a href="/">Home</a></li>
{% if user.is_staff %}
<li><a href="/admin/">Admin Panel</a></li>
{% endif %}
</ul>
模板标签的Mermaid流程图[编辑 | 编辑源代码]
以下是一个简单的模板标签处理流程:
数学公式支持[编辑 | 编辑源代码]
如果需要计算模板中的数值,可以使用数学公式。例如,计算百分比:
总结[编辑 | 编辑源代码]
Django模板标签提供了强大的逻辑控制能力,使得模板可以动态渲染内容而无需在视图中处理所有细节。通过合理使用内置标签和自定义标签,开发者可以创建灵活且易于维护的模板系统。