Django模板系统深入

Django模板系统深入

模板继承和重用

Block 标签

在Django模板中,{% block %} 标签允许你定义一个"块",这个块可以在子模板中被重写或填充。

html 复制代码
<!-- 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>
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 %} 标签允许你在一个模板中包含另一个模板的内容。这对于模板中的重复内容非常有用。

html 复制代码
<!-- 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文件。

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}"

在模板中使用:

html 复制代码
{% load my_custom_tags %}
<p>{% my_custom_tag "Hello" "World" %}</p>

模板加载和渲染

在Django视图中,你通常会使用 render 函数来加载和渲染模板。这个函数会自动处理请求对象、上下文数据和模板路径。

python 复制代码
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 配置项中注册自定义的上下文处理器。

python 复制代码
# settings.py

TEMPLATE_CONTEXT_PROCESSORS = [
    ...
    'myapp.context_processors.my_context_processor',
]
python 复制代码
# 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 设置来指定使用哪个模板引擎,以及它们的配置。

python 复制代码
# settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                ...
            ],
        },
    },
]

通过配置多个模板引擎,你可以为不同的项目部分使用不同的模板语言或框架。

总结

Django的模板系统是一个非常强大且灵活的工具,它允许你创建动态、可重用的HTML页面。通过掌握模板标签、过滤器、继承和重用、自定义标签和过滤器、上下文处理器以及模板引擎的配置,你可以更高效地管理和维护你的Django项目的视图层。

相关推荐
兵慌码乱5 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
呱呱复呱呱13 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
Nturmoils14 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波18 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
兵慌码乱1 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
倔强的石头_2 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
倔强的石头_5 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab5 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence6 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神6 天前
三、用户与权限管理
数据库·mysql