在Django框架中,模板系统是一个强大的工具,它允许开发者以简洁、直观的方式将动态内容嵌入到HTML页面中。通过使用模板,你可以将Python代码(主要是视图中的逻辑)与HTML标记分离,从而保持代码的清晰和可维护性。本章将带你快速入门Django的模板系统,包括模板的基本使用、变量、标签、过滤器以及模板继承等核心概念。
Django会在项目的templates
文件夹中查找模板文件。默认情况下,Django会在每个应用的templates
子文件夹中查找模板,但推荐的做法是在项目根目录下创建一个统一的templates
文件夹,并在设置文件settings.py
中通过TEMPLATES
配置项指定其路径。例如:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 指定模板文件夹路径
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
在Django视图中,你可以使用render
函数来渲染模板并返回给客户端。render
函数接受三个主要参数:请求对象、模板名称(或模板名称的列表)以及一个上下文字典,该字典包含了模板中将要使用的变量。
from django.shortcuts import render
def my_view(request):
# 准备上下文数据
context = {'name': 'Django', 'version': '3.x'}
# 渲染模板并返回
return render(request, 'myapp/index.html', context)
模板变量用于在模板中插入动态内容。在模板中,变量被双花括号{{ }}
包围。当模板被渲染时,Django会查找并替换这些变量为相应的值。
<p>Hello, {{ name }}! You are using Django {{ version }}.</p>
如果变量名与Python的保留字冲突,或者包含空格、点号等特殊字符,可以使用点号.
来访问对象的属性或字典的键,或者使用下划线_
作为前缀来避免冲突。
模板标签用于在模板中执行逻辑操作,如循环、条件判断等。模板标签被大括号{% %}
包围。Django提供了多种内置标签,如for
、if
、with
等。
for
标签用于遍历列表、元组、字典等可迭代对象。
<ul>
{% for item in item_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
if
标签用于在模板中进行条件判断。
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}.</p>
{% else %}
<p>Please log in.</p>
{% endif %}
模板过滤器用于修改变量的值,它们被管道符|
和过滤器名称包围。Django提供了许多内置过滤器,如upper
、lower
、length
等,也可以自定义过滤器。
<p>The length of the name is {{ name|length }}.</p>
<p>The name in uppercase is {{ name|upper }}.</p>
模板继承是Django模板系统的一个强大功能,它允许你创建一个基本的“骨架”模板,该模板包含站点共有的元素(如头部、导航栏、底部等),然后你可以创建继承自这个骨架模板的子模板,只需填充或覆盖特定的块(block)即可。
在基模板中,使用{% block %}
标签定义可以被子模板覆盖的块。
<!-- base.html -->
<html>
<head>
<title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
<header>
<!-- 头部内容 -->
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
<!-- 底部内容 -->
</footer>
</body>
</html>
在子模板中,使用{% extends %}
标签来指定它继承自哪个基模板,并使用{% block %}
标签来覆盖或添加内容到基模板的相应块中。
<!-- home.html -->
{% extends "base.html" %}
{% block title %}Home Page{% endblock %}
{% block content %}
<h1>Welcome to My Site</h1>
<p>This is the home page content.</p>
{% endblock %}
虽然Django提供了丰富的内置模板标签和过滤器,但在某些情况下,你可能需要创建自定义的模板标签或过滤器来满足特定的需求。这可以通过编写Python代码并在Django项目中注册这些自定义标签和过滤器来实现。
templatetags
的Python包(如果尚未存在)。__init__.py
和my_custom_tags.py
)。my_custom_tags.py
中编写自定义标签的逻辑,并使用@register.tag
或@register.inclusion_tag
等装饰器注册它们。{% load my_custom_tags %}
加载自定义标签,然后即可使用它们。创建自定义模板过滤器的过程与创建自定义模板标签类似,但你需要使用@register.filter
装饰器来注册过滤器,并在模板中使用管道符|
来应用它们。
Django的模板系统是一个功能强大且灵活的工具,它使得将动态内容嵌入到HTML页面中变得简单而直观。通过本章的学习,你应该已经掌握了模板的基本使用、变量、标签、过滤器以及模板继承等核心概念。接下来,你可以通过实践来加深对这些概念的理解,并探索Django模板系统提供的更多高级功能。记住,模板系统只是Django框架中的一个组成部分,要充分利用Django的强大功能,还需要学习并掌握其他组件,如模型(Models)、视图(Views)、表单(Forms)等。