Django模板系统深入
Django模板系统深入
模板继承和重用
Block 标签
在Django模板中,{% block %}
标签允许你定义一个“块”,这个块可以在子模板中被重写或填充。
<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
<h1>Welcome to my site</h1>
{% block content %}{% endblock %}
</body>
</html>
<!-- child.html -->
{% extends "base.html" %}
{% block title %}My Child Page{% endblock %}
{% block content %}
<p>This is my child page content.</p>
{% endblock %}
Includes 标签
{% include %}
标签允许你在一个模板中包含另一个模板的内容。这对于模板中的重复内容非常有用。
<!-- sidebar.html -->
<div id="sidebar">
<h2>Sidebar</h2>
<p>Some content for the sidebar.</p>
</div>
<!-- main.html -->
<!DOCTYPE html>
<html>
<head>
<title>Main Page</title>
</head>
<body>
<div id="content">
<h1>Main Content</h1>
<p>This is the main content area.</p>
</div>
{% include "sidebar.html" %}
</body>
</html>
自定义模板标签和过滤器
自定义模板标签
除了自定义过滤器,Django还允许你创建自定义模板标签。这需要在你的 templatetags
目录下创建一个 __init__.py
文件(以确保Python将其作为包处理),以及一个定义标签逻辑的Python文件。
# templatetags/my_custom_tags.py
from django import template
register = template.Library()
@register.simple_tag
def my_custom_tag(arg1, arg2):
return f"My custom tag result: {arg1} and {arg2}"
在模板中使用:
{% load my_custom_tags %}
<p>{% my_custom_tag "Hello" "World" %}</p>
模板加载和渲染
在Django视图中,你通常会使用 render
函数来加载和渲染模板。这个函数会自动处理请求对象、上下文数据和模板路径。
from django.shortcuts import render
def my_view(request):
context = {
'key': 'value',
'list': [1, 2, 3, 4, 5],
}
return render(request, 'my_template.html', context)
模板的上下文处理器
上下文处理器是一种将额外的上下文数据添加到每个模板请求中的机制。你可以在 settings.py
中的 TEMPLATE_CONTEXT_PROCESSORS
配置项中注册自定义的上下文处理器。
# settings.py
TEMPLATE_CONTEXT_PROCESSORS = [
...
'myapp.context_processors.my_context_processor',
]
# myapp/context_processors.py
def my_context_processor(request):
return {
'my_variable': 'Some value',
}
这样,在渲染模板时,my_variable
就会被添加到每个请求的上下文中。
模板引擎的配置
Django支持多个模板引擎,默认情况下使用的是Django模板引擎(django.template.backends.django.DjangoTemplates
)。你可以在 settings.py
中配置 TEMPLATES
设置来指定使用哪个模板引擎,以及它们的配置。
# settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
...
],
},
},
]
通过配置多个模板引擎,你可以为不同的项目部分使用不同的模板语言或框架。
总结
Django的模板系统是一个非常强大且灵活的工具,它允许你创建动态、可重用的HTML页面。通过掌握模板标签、过滤器、继承和重用、自定义标签和过滤器、上下文处理器以及模板引擎的配置,你可以更高效地管理和维护你的Django项目的视图层。