How-To's Web Development

Django 模板终极指南

Read this post in other languages:

Django 模板是框架的重要组成部分。 了解它们是什么以及它们为什么有用,可以帮助您为 Django 网站和应用构建无缝、适应性强且功能齐全的模板。

如果您刚接触这个框架,想要建立您的第一个 Django 项目,那么掌握模板至关重要。 在这篇指南中,您将找到有关 Django 模板的所有信息,包括不同类型以及使用方法。

什么是 Django 模板?

Django 模板是 Django 框架的基本组成部分。 借助模板,您能够将网站的视觉呈现与底层代码分开。 模板包含所需 HTML 输出的静态部分和描述如何插入动态内容的特殊语法。 

最终,模板可以生成完整的网页,数据库查询和其他数据处理任务则由视图模型处理。 这种隔离将 HTML 业务逻辑与 Django 项目其余部分的 Python 代码分开,确保代码干净、可维护。 如果没有模板,您需要将 HTML 直接嵌入 Python 代码,这会使其难以阅读和调试。

下面是一个 Django 模板的示例,其中包含一些 HTML、一个变量 `name` 和基本的 `if/else` 逻辑:

<h1>Welcome!</h1>


{% if name %}
  <h1>Hello, {{ name }}!</h1>
{% else %}
  <h1>Hello, Guest!</h1>
{% endif %}
<h1>{{ heading }}</h1>

使用模板的好处

开发者使用 Django 模板帮助他们快速高效地构建可靠的应用。 模板的其他主要好处包括:

  • 代码可重用性:可以创建可重用的组件和布局,在不同页面和应用之间保持一致。
  • 更易维护:可以在不改变底层逻辑的情况下修改网页外观。
  • 改进的可读性:HTML 代码无需复杂逻辑即可保持简洁易懂。
  • 模板继承:可以定义通用结构和布局,从而减少重复并提高一致性。
  • 动态内容:可以构建适应用户输入和数据变化的个性化网页。
  • 性能优化:可以缓存模板,提高应用或网站的性能。

挑战和限制

在 Django 中,模板是呈现网页的关键,但应该谨慎使用,特别是在具有较大数据集的复杂项目中。 虽然 Django 的模板语言相对简单,但是如果模板过于复杂,包含大量嵌套标记、筛选器和继承,就会难以管理和维护。 模板的重点应该放在呈现上,其中不应嵌入过多逻辑。 自定义选项也有限,除非您创建自己的自定义标记或填充。

迁移到不同的模板引擎可能具有挑战性,因为 Django 的默认引擎与框架紧密相关。 不过,切换到 Jinja 这样的替代方案相对简单,我们将在本指南的后续部分讨论这种可能性。

调试 Django 模板

在某些情况下(例如出现问题时),了解模板的运作方式会有所帮助。 为此,您可以使用模板调试。

模板调试侧重于识别 HTML 与动态数据交互方式中的错误。 常见问题包括缺失变量、模板标记不正确和逻辑错误。

好在 Django 提供了许多实用工具,例如用于检查模板的 {{ debug }} 和高亮显示问题所在位置的详细错误页面。 这使查明和解决问题变得更加简单,确保模板按预期呈现。

理解 Django 模板语言 (DTL)

Django 模板语言 (DTL) 是 Django 的内置模板引擎,旨在简化动态网页的创建。 它将 HTML 与 Django 特定标记和筛选器无缝融合,让您可以直接从 Django 应用生成丰富的以数据为基础的内容。 我们来探索一些使 DTL 成为强大模板构建工具的关键功能。

DTL 基本语法和结构

Django 模板的编写结合了 HTML 和 DTL 语法。 Django 模板的基本结构由包含嵌入式 Django 标记和变量的 HTML 标记组成。

例如:

<!DOCTYPE html>
<html>
  <head>
    <title>{{ page_title }}</title>
  </head>
  <body>
    <h1>{{ heading }}</h1>
    <ul>
      {% for item in item_list %}
        <li>{{ item.name }}</li>
      {% endfor %}
    </ul>
  </body>
</html>

变量、筛选器和标记

DTL 具有多项用于处理变量、筛选器和标记的功能:

  • 变量:变量在模板中显示动态数据。 它们被括在双花括号中,例如 {{ variable_name }}
  • 筛选器:筛选器修改变量的值或为其设置格式,然后进行呈现。 它们使用管道字符 ( | ),例如 {{ variable_name|upper }}
  • 标记:标记控制模板的逻辑和流程。 它们被封装在 {% %} 块中,可以执行各种操作,如循环、条件和模板包含。

PyCharm 是用于 Django 开发的专业 IDE,通过提供语法高亮显示对标记、变量和 HTML 进行颜色编码以提高可读性,简化了 Django 模板的使用。 它还提供实时错误检测,确保您不会错过结束标记或错误放置语法。 借助变量和标记的自动补全,您可以更快地编写代码并减少错误。

模板继承和扩展基础模板

借助框架的模板继承系统,您可以创建一个包含网站或应用的标准结构和布局的基础模板。

然后,您可以创建继承自基础模板的子模板,并根据需要重写特定部分块。 这可以促进不同模板之间的代码重用和一致性。

要创建基础模板,您可以使用 {% block %} 标记定义块:

<!-- base.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>{% block title %}Default Title{% endblock %}</title>
  </head>
  <body>
    {% block content %}
    {% endblock %}
  </body>
</html>

然后,子模板会扩展基础模板并重写特定块:

<!-- child_template.html -->
{% extends 'base.html' %}

{% block title %}My Page Title{% endblock %}

{% block content %}
  <h1>My Page Content</h1>
  <p>This is the content of my page.</p>
{% endblock %}

Django 模板标记

标记是 Django 模板的重要元素。 从条件呈现和循环到模板继承和包含,它们提供了各种功能。

我们来详细探讨一下。

常用 Django 模板标记

Django 中有多个模板标记,但您最常用到的可能是:

  • {% if %}:此标记可以根据特定条件有条件地呈现内容。 它通常与 {% else %}{% elif %} 标记一起使用。
  • {% for %}{% for %} 标记用于遍历列表或查询集等序列,并为序列中的每个条目呈现内容。
  • {% include %}:借助此标记,您可以在当前模板中包含另一个模板文件的内容。 它有助于在多个模板之间重用常用模板代码段。
  • {% block %}{% block %} 标记与模板继承结合使用。 它定义了子模板在扩展基础模板时可以重写的内容块。
  • {% extends %}:此标记指定当前模板应继承的基础模板。
  • {% url %}:此标记用于为 Django 项目中的具名 URL 模式生成 URL。 它有助于保持模板与实际 URL 路径分离。
  • {% load %}{% load %} 标记用于从 Python 模块或库加载自定义模板标记和筛选器,您可以使用它扩展 Django 模板系统的功能。

这些只是 Django 中众多模板标记的一些示例。 {% with %}{% cycle %}{% comment %} 等标记可以为高级项目提供更多功能,帮助您构建高效自定义应用。

使用模板标记

以下是在 Django 模板中使用标记的详细示例:

{% extends 'base.html' %}
{% load custom_filters %}

{% block content %}
  <h1>{{ page_title }}</h1>
  {% if object_list %}
    <ul>
      {% for obj in object_list %}
<!-- We truncate the object name to 25 characters. -->
        <li>{{ obj.name|truncate:25 }}</li>
      {% endfor %}
    </ul>
  {% else %}
    <p>No objects found.</p>
  {% endif %}

  {% include 'partials/pagination.html' %}
{% endblock %}

在这个示例中,我们扩展了一个基础模板,加载了自定义筛选器,然后为主要内容定义了一个块。

在块内,我们检查 object_list 是否存在,如果存在,我们对其循环遍历,并显示每个对象的截断名称。 如果列表为空,我们会显示 No objects found(找不到对象)消息。

最后,我们添加了一个用于分页的分部模板。 此模板是可重用的 HTML 代码段,可以包含在其他模板中,让您能够更有效地管理和更新常用元素(如分页)。

Django 管理模板

Django 的内置管理界面让您能够通过人性化且直观的方式管理应用程序数据。 它由一组定义其结构、布局和外观的模板提供支持。

功能

Django 管理模板处理多种任务:

  • 身份验证:控制用户身份验证、登录和退出登录。
  • 模型管理:显示模型实例列表,并根据需要创建、编辑和删除实例。
  • 表单呈现:呈现用于创建和编辑模型实例的表单。
  • 导航:呈现管理界面的导航结构,包括主菜单和应用特定子菜单。
  • 分页:显示模型实例列表时呈现分页控件。
  • 历史跟踪:显示和管理模型实例的更改历史。

Django 的内置管理模板为管理应用程序数据提供了坚实基础。

自定义管理模板

虽然 Django 的管理模板直接提供了一个良好且实用的界面,但您可能也会想自定义其外观或行为来满足项目需求。

您可以进行更改以匹配项目的品牌信息、改进用户体验或添加应用特有的自定义功能。

您可以通过多种方式进行更改:

  • 重写模板:您可以在项目的模板目录中创建具有相同文件结构和命名约定的模板来重写默认管理模板。 然后,Django 将自动使用自定义模板而不是内置模板。
  • 扩展基础模板:Django 的许多管理模板都是使用模板继承构建的。 您可以创建扩展基础管理模板并重写特定块或部分的模板。
  • 模板选项:Django 有多种模板选项,您可以借助这些选项自定义管理界面的行为。 这包括显示特定字段、指定哪些字段应为可编辑,以及为特定模型字段定义自定义模板。
  • 管理网站自定义:您可以将 AdminSite 类子类化并使用 Django 注册自定义管理网站来自定义管理网站的外观和行为。

Django 中的 URL 模板

Django 中的 URL 模板提供了一种灵活的方式来定义和生成 Web 应用程序的 URL。

了解 URL 模板

在 Django 中,您可以使用 django.urls 模块中的 path 函数在项目的 urls.py 文件中定义 URL 模式。

这些 URL 模式将特定 URL 模式映射到处理相应 HTTP 请求的 Python 函数(视图)。

下面是 Django 中基本 URL 模式的示例:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('about/', views.about, name='about'),
]

在示例中,URL 模式 ‘ ‘ 映射到 views.home 视图函数,URL 模式 ‘about/’ 映射到 views.about 视图函数。

使用 URL 模板的动态 URL 生成

借助 Django 中的 URL 模板,您可以在 URL 模式中包含变量或形参。 这意味着您可以创建动态 URL 来表示同一资源的不同实例或包含更多数据。

如果您的 urls.py 文件包含使用 include() 的其他 URL 文件,PyCharm 会自动收集并识别所有嵌套路由,确保 URL 名称建议保持准确。 您还可以按 Ctrl并点击 URL 名称导航到 URL 定义,直接跳转到其源,即使该 URL 是在子文件中定义的。

我们来看一个带有变量的 URL 模板的示例:

# urls.py
urlpatterns = [
    path('blog//', views.year_archive, name='blog_year_archive'),
]

在本例中,URL ‘blog//’ 包含类型 int 的变量 year。 当请求与此模式匹配时,Django 会将年份的值作为实参传递给 views.year_archive 视图函数。

使用 Django URL

Django URL 是任何应用程序的基础,通过将用户请求关联到适当的视图来运作。 Django 会定义与特定视图匹配的 URL 模式,确保您的网站保持整洁且可扩缩。 

将 URL 模板与 Django 的 reverse 函数结合使用

借助 Django 的 reverse 函数,您可以根据具名 URL 模式生成 URL。 它将 URL 模式的名称作为其第一个实参,然后是其他必需实参,再返回相应 URL。

下面是实际运作的示例:

# views.py
from django.shortcuts import render
from django.urls import reverse

def blog_post_detail(request, year, month, slug):
    # ...
    url = reverse('blog_post_detail', args=[year, month, slug])
    return render(request, 'blog/post_detail.html', {'url': url})

reverse 函数用于为 ‘blog_post_detail’ URL 模式生成 URL ,并将 year、month 和 slug 值作为实参传递。

然后,您可以在模板或其他应用程序部分中使用返回的 URL。

在 Django 模板中使用 URL 标记

Django 的 {% url %} 模板标记提供了在模板内直接生成 URL 的简约方式。 您可以引用具名 URL 模式,而不是硬编码 URL,这使模板更加灵活、更易管理。

例如:

 
阅读更多内容 

在本例中,{% url %} 标记为 blog_post_detail 视图创建 URL,并传入 yearmonthslug 形参。 确保这些实参与 urls.py 文件中定义的 URL 模式匹配非常重要,它应该如下所示:

path('blog////', views.blog_post_detail, name='blog_post_detail'),

这种方式有助于保持模板的简洁性和适应性,特别是在项目发展过程中。

Jinja 与 Django 模板

虽然 Django 带有内置模板引擎 (DTL),但开发者也可以选择使用 Jinja 等替代方案。

Jinja 是一种流行、现代且功能丰富的 Python 模板引擎。 它最初是为 Flask Web 框架开发的,现在也与 Django 兼容。

引擎的设计目标是快速、安全且高度可扩展。 广泛的功能集使其能够灵活呈现动态内容。

Jinja 相对于 Django 的 DTL 的一些主要功能和优势包括:

  • 更简洁、更直观的语法。
  • 沙盒式执行可以增强抵御代码注入攻击的安全性。
  • 更加灵活和强大的继承系统。
  • 更好的调试工具和报告机制。
  • 处理复杂模板或大型数据集时速度更快。
  • 包含内置筛选器和宏的增强功能,可以实现更复杂的呈现逻辑而不会使模板混乱。

PyCharm 可以自动检测文件类型 *.jinja,并提供语法高亮显示、代码补全和错误检测,以及对自定义筛选器和扩展的支持,确保流畅的开发体验。

尽管有这些好处,但同样应该记住,将 Jinja 集成到 Django 项目中需要更复杂的设置和更深入的配置。

某些开发者可能还是更喜欢使用 Django 的内置模板引擎,将所有内容保留在 Django 生态系统中。

使用 Django 实时模板更快地编写代码

利用 PyCharm 的实时模板功能,您可以通过简单的关键字快捷方式快速插入常用代码段。

只需按 ⌘J、输入 ListView,然后按 Tab 键即可调用实时模板。

这样可以减少样板编码,加快开发速度,并确保语法的一致性。 您甚至可以自定义或创建自己的模板,满足特定项目需求。 此功能对于 DTL 语法特别有用,因为其中循环、条件和块结构经常重复。

使用 Django 模板:最佳做法和提示

使用 Django 模板是管理 Web 应用呈现层的绝佳方式。

不过,遵循指导并进行性能优化对于确保模板维护良好、安全和系统化至关重要。

以下是使用 Django 模板时应该记住的一些最佳做法和提示:

  • 分离呈现和业务逻辑。 让模板专注于呈现数据,并在视图或模型中处理复杂流程。
  • 按逻辑组织模板。遵循 Django 的文件结构,按应用和功能分离模板,根据需要使用子目录。
  • 使用 Django 的命名约定。 Django 遵循“约定优于配置”原则,支持以特定方式为模板命名,让您无需显式提供模板名称。 例如,使用 ListView 等基于类的视图时,Django 会自动查找名为 /_list.html 的模板,简化您的代码。
  • 将复杂任务分解为可重用组件。使用模板标记、筛选器和包含促进代码重用并提高可维护性。
  • 遵循一致的命名约定。为模板、标记和筛选器使用清晰的描述性名称。 这样,其他开发者就可以更容易地阅读您的代码。
  • 使用 Django 的安全呈现筛选器。在呈现之前始终转义用户提供的数据,防止 XSS 漏洞。
  • 记录复杂模板逻辑。使用清晰的注释来解释模板的复杂部分。 这将帮助其他人(以及未来的您自己)理解您的代码。
  • 分析您的模板。 使用 Django 的分析工具查找和优化性能瓶颈,例如低效的循环和复杂的逻辑。

观看这段视频,详细了解 Django 提示和 PyCharm 功能。

结论

无论是构建简单的网站还是复杂的应用,现在您都应该已经知道如何创建 Django 模板来增强用户体验并简化开发流程。

但模板只是 Django 框架的一个组成部分。 探索我们可以帮助您学习 Django 的其他 Django 博客和资源,发现 Django 的最新功能,等等。 您也可以阅读 Django 的官方文档

PyCharm 中可靠的 Django 支持

从完全的初学者到熟练的开发者,PyCharm Professional 都可以帮助简化 Django 开发工作流。

Django IDE 提供了 Django 特定编码辅助、调试、实时预览、项目级导航和重构功能。 PyCharm 包含对 Django 模板的完全支持,让您可以轻松管理和编辑模板。 您还可以一键连接到数据库,并与 TypeScript、JavaScript 和其他前端框架无缝协作。

有关如何在 PyCharm 中使用 Django 模板的完整详细信息,请参阅我们的文档。 如果您是 Django 框架的新手,可以先阅读我们的综合教程,教程涵盖了在 PyCharm 中创建新 Django 应用的所有步骤。

准备好开始了吗? 立即下载 PyCharm,享受更高效的开发流程。

 
 
本博文英文原作者:
Evgenia Verbina

Evgenia Verbina

image description

Discover more

OSZAR »