继续我们的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. 模板过滤器
模板过滤器用于过滤变量/属性。
注:符号 | (管道)用于指示过滤器。
一些例子是:
- 更改大小写–> {{ name|title }} 或 {{characters|upper_case }}
- 列表过滤器/切片–> {{ list|slice = “ :5 “ }}
这意味着仅显示列表中的前 5 个元素。 - Truncation –> {{ name|truncatewords : 80 }}
这意味着从名称开始,仅显示前 80 个字符,即将名称截断为前 80 个字符。 - Default –> {{ value|default =”0” }}
这意味着如果变量值为空,则显示默认值 0。
1. 创建 Django 模板文件夹
在 Django 中,由于我们将所有前端文件与后端分开,因此这些文本文件(主要是 HTML 文件)也保存在单独的文件夹中。
现在,如果我们转到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文件:
现在将代码添加到文件中:
{ % for book in books % } <li>{{book.title}}< / li><br> { % endfor % } |
该代码是不言自明的,因为它是打印书籍列表的通用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行。
正确并多次阅读以上段落,以了解我们正在尝试做什么。
现在让我们制作一个简单的basic.html文件,它将“ Hello Viewer ”添加到其所有网页。
用于写入文件的语法是:
<h2>Hello Viewer< / h2> { % block content % } <p> PlaceHolder to be Replaced< / p> { % endblock % } |
在基本文件中,我们添加一个块(在我的例子中名称为“content”),然后添加一个默认行,以防在加载其他 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文件中使用的)。
在该块内,我们编写将替换默认行的代码
现在让我们运行服务器并检查浏览器
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’ %},它与我们之前使用的继承语法类似。
现在让我们运行服务器并检查浏览器
结论
这就是 Django 模板教程的全部内容!我们希望您对 Django 中的模板功能有充分的了解。另外,您可以从官方文档中了解更多关于我们这里使用的 Django 模板语言的信息。
请继续关注有关 Django 主题的更多高级教程!