访问量: 10 次浏览
模板是 Django 的 MVT 结构的第三部分,也是最重要的部分。Django 中的模板基本上是用 HTML、CSS 和 JavaScript 写在一个 .html 文件中。Django 框架有效地处理和生成动态的 HTML 网页,让终端用户看到。Django 的功能主要是后端,所以,为了提供一个前端,为我们的网站提供一个布局,我们使用模板。根据我们的需要,有两种方法可以将模板添加到我们的网站上:
对于我们目前的项目,为了简单起见,我们将创建一个单一的模板目录,它将分布在整个项目中。应用程序级的模板一般用于大项目,或者在我们想为网页的每个组件提供不同的布局时使用。
Django 模板可以在 app_name/settings.py 中进行配置。
TEMPLATES = [
{
# Template backend to be used, For example Jinja
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# Directories for templates
'DIRS': [],
'APP_DIRS': True,
# options to configure
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
使用一个示例项目说明如何在 Django 中使用模板。模板不仅可以显示静态数据,还可以显示通过上下文字典连接到应用程序的不同数据库的数据。考虑一个名为 geeksforgeeks 的项目,它有一个名为 geeks 的应用程序。
要渲染一个模板,需要一个视图和一个映射到该视图的 URL。让我们先在 geeks/views.py 中创建一个视图。
# import Http Response from django
from django.shortcuts import render
# create a function
def geeks_view(request):
# create a dictionary to pass
# data to the template
context = {
"data": "Gfg is the best",
"list": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}
# return response with template and context
return render(request, "geeks.html", context)
现在我们需要映射一个 URL 来渲染这个视图。
from django.urls import path
# importing views from views..py
from .views import geeks_view
urlpatterns = [
path('', geeks_view),
]
最后在 templates/geeks.html 中创建一个模板。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Homepage</title>
</head>
<body>
<h1>Welcome to Geeksforgeeks.</h1>
<p>Data is {{ data }}</p>
<h4>List is </h4>
<ul>
{% for i in list %}
<li>{{ i }}</li>
{% endfor %}
</body>
</html>
让我们检查一下它是否在工作。

这是由 Django 模板提供的最重要的设施之一。Django 模板是一个使用 Django 模板语言标记的文本文档或 Python 字符串。模板引擎可以识别和解释一些结构。主要的是变量和标签。正如我们在上面的例子中使用了 for 循环,我们把它作为一个标签。同样,我们可以使用其他各种条件,如 if、else、if-else、empty 等等。
Django 模板语言的主要特点是变量、标签、过滤器和注释。
变量从上下文中输出一个值,它是一个类似于口令的对象,将键映射到值。我们从视图中发送的上下文对象可以在模板中使用 Django Template 的变量进行访问。
语法:
{{ variable_name }}
示例:
变量是由 {{ 和 }} 包围的,像这样:
My first name is {{ first_name }}. My last name is {{ last_name }}.
在上下文为 {'first_name': 'Naveen', 'last_name': 'Arora'} 的情况下,该模板渲染为:
My first name is Naveen. My last name is Arora.
标签在渲染过程中提供任意的逻辑。例如,一个标签可以输出内容,作为一个控制结构,例如 "if" 语句或 "for" 循环,从数据库中抓取内容,甚至可以访问其他模板标签。
语法:
{% tag_name %}
示例:
标签被 {% 和 %} 所包围,像这样:
{% csrf_token %}
大多数标签都接受参数,例如:
{% cycle 'odd' 'even' %}
常用标签:
| Comment | cycle | extends |
|---|---|---|
| if | for loop | for ... empty loop |
| Boolean Operators | firstof | include |
| lorem | now | url |
Django 模板引擎提供过滤器,用于转换变量和标签参数的值。我们已经讨论了主要的 Django 模板标签。标签不能修改变量的值,而过滤器可以用来增加变量的值或根据自己的需要修改它。
语法:
{{ variable_name | filter_name }}
过滤器可以是 "链式" 的。一个过滤器的输出被应用于下一个。{{ text|escape|linebreaks }} 是一个常见的习惯,用于转义文本内容,然后将换行符转换为 <p> 标签。
示例:
{{ value | length }}
如果值是 ['a', 'b', 'c', 'd'],输出将是 4。
主要模板过滤器:
| add | addslashes | capfirst |
|---|---|---|
| center | cut | date |
| default | dictsort | divisibleby |
| escape | filesizeformat | first |
| join | last | length |
| linenumbers | lower | make_list |
| random | slice | slugify |
| time | timesince | title |
| unordered_list | upper | wordcount |
模板忽略了 {% comment %} 和 {% endcomment %} 之间的所有内容。在第一个标签中可以插入一个可选的注释。例如,这在注释代码时很有用,可以记录代码被禁用的原因。
语法:
{% comment 'comment_name' %}
{% endcomment %}
示例:
{% comment "Optional note" %}
Commented out text with {{ create_date|date:"c" }}
{% endcomment %}
Django 的模板引擎中最强大也是最复杂的部分是模板继承。模板继承允许你建立一个基本的 "骨架" 模板,它包含了你网站的所有通用元素,并定义了子模板可以覆盖的块。extends 标签用于 Django 中的模板继承。人们需要不断地重复相同的代码。使用 extends ,我们可以继承模板和变量。
语法:
{% extends 'template_name.html' %}
示例:
假设目录结构如下:
dir1/
template.html
base2.html
my/
base3.html
base1.html
在 template.html 中,以下路径是有效的:
{% extends "./base2.html" %}
{% extends "../base1.html" %}
{% extends "./my/base3.html" %}