Django 模板 – 综合参考指南

继续我们的Django 教程系列,让我们了解 Django 模板。为了制作 Web 应用程序,您需要前端和后端。

如果我们把这两者混合起来,就会很混乱。Django 为我们提供了一种非常强大的方法来使 HTML/CSS 前端代码与后端代码完全分离。


DTL——Django 模板语言

使用 Django Templates,前端开发人员不需要学习 python,后端程序员不需要了解 HTML。

前端开发人员可以简单地留下 HTML 注释(无论他想要从 Django 获得数据库和其他信息)。稍后,程序员可以简单地将它们替换为模板语言——称为 Django 模板语言 (DTL)

因此,DTL 是用于在 HTML 文件中嵌入 Django/python 代码的模板语言之一。

DTL相对于其他产品的优势在于

  • 简单
  • 语法简单易学
  • 可扩展的

Django 模板语言(DTL)的基本语法

DTL语法与python类似,非常容易学习。又分为3种

1. 模板标签

这些模板标签可以做一些事情。这句话可能很难理解,但是看完例子你就会明白了,所以不用担心!

注意:模板标签由{%%}括起来。一些例子是:

  • 条件语句/显示逻辑–> {% if %} … {% endif %}
  • 循环–> {% for x in y %} … {% endfor %}
  • 块声明–> {% 块内容 %} … {% endblock %}
  • 内容导入–> {% include “header.html” %}
  • 继承–> {% extends “base.html” %}

2. 模板变量

模板变量与python中使用的变量类似

注意:使用的语法是{{}}一些示例是:

  • 简单变量–> {{ title }} , {{ x }}
  • 列表属性–> {{fruits_list.0}}
  • 对象属性–> {{ name.title }}
  • 字典属性–> {{ dict.key }}

注意:这里使用 list.0 与 python 中的 list[0] 不同,用于访问Python 列表的第一个元素


3. 模板过滤器

模板过滤器用于过滤变量/属性。

注:符号 | (管道)用于指示过滤器。

一些例子是:

  1. 更改大小写–> {{ name|title }} 或 {{characters|upper_case }}
  2. 列表过滤器/切片–> {{ list|slice = “ :5 “ }}
    这意味着仅显示列表中的前 5 个元素。
  3. Truncation –> {{ name|truncatewords : 80 }}
    这意味着从名称开始,仅显示前 80 个字符,即将名称截断为前 80 个字符。
  4. Default –> {{ value|default =”0” }}
    这意味着如果变量值为空,则显示默认值 0。

1. 创建 Django 模板文件夹

在 Django 中,由于我们将所有前端文件与后端分开,因此这些文本文件(主要是 HTML 文件)也保存在单独的文件夹中。

模板设置.py

现在,如果我们转到settings.py,将会有一个TEMPLATES选项,如上所示。现在这里重要的是APP_DIRS

'APP_DIRS':True

这行代码的意思是 Django 将在名为templates的文件夹中搜索 templates/HTML 文件

这意味着我们必须在 Django 应用程序中创建一个 templates 文件夹并在其中保存所有 HTML 文件。

模板文件夹

2. 模板命名空间

当我们加载特定的模板文件时,Django 会遍历settings.py 中INSTALLED_APPS中列出的每个应用程序。它按照从上到下的顺序执行此操作,并加载它获得的具有该名称的第一个文件。 

我们的项目中可能有多个应用程序,并且多个应用程序中可能存在两个同名的 HTML 文件。

假设您有一个 Books 应用程序和一个 Pens 应用程序。两者的模板文件夹中都有一个index.html文件。

如果您尝试将index.html包含在Books应用程序的views.py中,Django可能最终会加载错误的index.html文件。

发生这种情况是因为,如前所述,它从 INSTALLED_APPS 列表中加载文件的第一个实例。

这可能会导致问题。为了避免这种情况,我们在模板文件夹中使用命名空间。

我的意思是在模板文件夹内添加另一个具有应用程序名称的文件夹。

命名空间

就我而言,该应用程序名为“ books _website ”,因此我将使用该名称命名模板文件夹(如上面的屏幕截图所示)。

因此,当您在views.py中包含该文件时,您将把包含路径写为

“ <app_name>/<HTML file>”

也就是说,就我而言,它将是

‘books_website/index.html’

命名约定可以根据需要更改,不需要是应用程序名称。

但是,为了方便起见,使用应用程序名称是标准做法。

3. 创建基本DTL文件

现在让我们制作一个简单的模板文件并学习如何将其包含在我们的views.py 中。在应用程序的 templates/books_website 文件夹中,添加bookView.html文件:

books_website/BookView.html

现在将代码添加到文件中:

{% for book in books %}
    <li>{{book.title}}</li><br>
{% endfor %}
BookView.html

该代码是不言自明的,因为它是打印书籍列表的通用for 循环。

4.在views.py中渲染模板 

将模型信息发送到模板文件的最有效方法是使用views.py 中的render 函数。

render(request,<html file path>,<context>)

render方法获取上下文(即模型信息),使用其路径将其发送到模板然后为浏览器返回适当的响应。

views.py中,在BookView中编写代码

def BookView(request):
    books = BookModel.objects.all()
    context = {
        'books':books
    }
    return render(request,'books_website/BookView.html', context)
图书浏览

这里:

  • 我们将模型数据存储到书中
  • 注意:我们创建了一个上下文作为字典
  • 我们调用渲染函数,它将请求、模板路径和上下文作为参数并返回适当的响应。

现在让我们运行服务器并检查浏览器

浏览器

5.模板继承

现在在BookView.html 中,我们有一个小的 HTML 片段,但实际上,HTML 文件通常很长。

由于网站的大部分网页都是相同的,只是内容有所修改,Django提供了一种称为模板继承的方法。这避免了重复代码并添加不必要的冗余的需要。

模板继承的另一个好处是能够修改主代码文件,以便 UI/HTML 更改反映到整个应用程序。

因此,我们创建了基本的 HTML 文件,该文件具有所有页面之间通用的完整代码框架。

我们将此文件存储在应用程序外部(项目中)的模板文件夹中,以便每个Django应用程序都可以访问它们。

要继承其他模板中的代码,请将此行添加到settings.py中的TEMPLATES中。

'DIRS': [os.path.join(BASE_DIR,'django_project/templates')],

这行代码很容易理解:

  • 我们使用预定义变量BASE_DIR获取 Django 基本目录(我们的 Django 项目文件夹)
  • 然后使用os module,我们将其加入到django_project/templates行。

正确并多次阅读以上段落,以了解我们正在尝试做什么。

基本 HTML 路径

现在让我们制作一个简单的basic.html文件,它将“ Hello Viewer ”添加到其所有网页。

用于写入文件的语法是

<h2>Hello Viewer</h2>
{% block content %}
    <p> PlaceHolder to be Replaced</p>
{% endblock %}

在基本文件中,我们添加一个(在我的例子中名称为“content”),然后添加一个默认行,以防在加载其他 HTML 文件时发生错误。

该默认行将替换为应用程序内 HTML 文件中的内容。

基本.html

现在让我们更改 BookView.html 文件以合并basic.html文件。

将下面的代码写入文件中

{% extends 'basic.html' %}
 
{% block content %}
    {% for book in books %}
        <li>{{book.title}}</li><br>
    {% endfor %}
{% endblock %}
  • 我们在开头添加一行{% extends ‘basic.html’ %}来继承父文件(basic.html)

为了指示 Django,basic.html文件中存在的块(名称 – 内容)将被替换,我们添加一个具有相同名称的块(我们在basic.html文件中使用的)。

在该块内,我们编写将替换默认行的代码

BookView.html

现在让我们运行服务器并检查浏览器

浏览器继承

6.模板包含

与继承类似,Django 模板文件也可以包含在其他 HTML 文件中。

让我们创建另一个文件BookViewAdd.html,它添加一个标题“ Books Hub ”,然后将其包含到BookView.html中

在books_website/templates 文件夹中创建另一个名为 (BookViewAdd) 的 HTML 文件,然后添加以下行

<h3>Book Hub</h3>
图书视图添加

现在在BookView.html中,在块内容内添加包含代码行

{% extends 'basic.html' %}
 
{% block content %}
    {% include 'books_website/BookViewAdd.html' %}
    {% for book in books %}
        <li>{{book.title}}</li><br>
    {% endfor %}
{% endblock %}

这里我们使用了{% include ‘books_website/BookViewAdd.html’ %},它与我们之前使用的继承语法类似。

BookView 包含

现在让我们运行服务器并检查浏览器

浏览器

结论 

这就是 Django 模板教程的全部内容!我们希望您对 Django 中的模板功能有充分的了解。另外,您可以从官方文档中了解更多关于我们这里使用的 Django 模板语言的信息

请继续关注有关 Django 主题的更多高级教程!