1. Django模板基础
Django模板是用来生成HTML的工具。在Django中,一个模板就是一个文本文件。这个文件包含了一些变量、过滤器以及标签。Django的模板通常使用 .html文件扩展名。
1.1 模板的创建和配置
首先,我们需要在Django项目中创建一个 HTML 模板。在应用程序的templates文件夹下,新建一个名为 template.html 的文件。
接下来,我们要在Django项目的 settings.py 文件中进行一些配置,以便让 Django 知道在哪里查找我们的模板。
# 在settings.py中添加模板路径
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
'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',
],
},
},
]
这里我们只需要设置 `APP_DIRS` 就好,这指定了 Django 在每个已安装的应用程序中查找 `templates` 目录。
2. 模板标签
在 Django 模板中,标签是一段由花括号包裹的代码,用来执行某些特殊操作。
2.1 变量标签
变量标签`{{ variable }}`用于在模板中插入变量的值。在这个标签中,我们可以使用变量、过滤器以及简单的计算表达式。
{{ var }}
在上面的例子中,我们简单地使用了 `var` 这个变量。它将会在页面显示为 `` 标签中的文本。
2.2 for标签
for 标签可以在 Django 模板中迭代并输出一个可迭代对象中的所有元素。其基本形式如下:
{% for item in items %}
{{ item }}
{% endfor %}
在上面的例子中,我们遍历了变量 `items`,并在每次迭代时输出其中的一个元素。{{item}} 变量是当前迭代的元素。
2.3 if 标签
if 标签允许你在 Django 模板中执行条件语句。它的语法类似于 Python 语言中的 if 语句。
{% if num > 5 %}
The number is greater than 5
{% else %}
The number is less than or equal to 5
{% endif %}
在这个例子中,我们根据变量 `num` 中的值输出不同的内容。
3. 模板继承
模板继承允许我们在多个 HTML 页面中重用相同的内容块。例如,许多页面都可能有相同的页眉、页脚和导航栏。
为了实现模板继承,我们需要在 base 模板中定义用于通用元素的块。子模板只需覆盖它想要自定义的块即可。
我们来看一个示例:
在 base 模板中,我们定义了一个名为 "content" 的块。我们将在子模板中覆盖这个块。
{% block head %}
{% block title %}{% endblock %}
{% endblock %}
{% block header %}
Site Name
{% endblock %}
{% block content %}
{% endblock %}
{% block footer %}
Copyright © 2021
{% endblock %}
在子模板(例如 index.html)中,我们只需继承该模板并在需要的位置覆盖所需块。
{% extends 'base.html' %}
{% block title %}Home{% endblock %}
{% block content %}
Welcome to my website
This is the home page of my website
{% endblock %}
在这个例子中,我们扩展了 base.html 模板,并覆盖了块 title 和 content。
4. 模板过滤器
模板过滤器提供了一种原生的方法来转换和格式化模板变量的值。Django 中有许多内置的过滤器。
4.1 date 过滤器
`date` 过滤器可以将日期并按照指定格式进行格式化。
{% now 'Y-m-d H:i:s' %}
这个例子中,我们将当前日期格式化为 Y-M-d H:i:s 的形式。
4.2 length 过滤器
`length` 过滤器可以计算可迭代对象中的元素数量。
{% for item in items %}
{{ item }} ({{ forloop.counter }} of {{ items|length }})
{% endfor %}
在上面的例子中,我们在每次迭代中使用 `forloop.counter` 和 `length` 过滤器为元素添加了一个计数器。
5. Django模板的全局变量
除了上述这些常用的模板标签和过滤器之外,Django 还为模板提供了一些全局变量,可以帮助我们处理和显示数据。
5.1 csrf_token
在 Django 中,为了防止跨站请求伪造(CSRF)攻击,每个包含表单的页面都要包含一个 CSRF 令牌。这个令牌是用来验证表单提交的来源是否是同一个网站的。
我们可以使用 `csrf_token` 全局变量在模板中添加这个令牌。
5.2 settings
`settings` 全局变量可以让我们在模板中访问 Django 项目中的设置。例如,我们可以访问 `MEDIA_URL` 和 `STATIC_URL`。
{{ settings.MEDIA_URL }}
{{ settings.STATIC_URL }}
5.3 url
`url` 全局变量允许我们构建带有参数的 URL。
在这个例子中,我们使用 `url` 全局变量为一个博客文章创建了一个链接。`blog_post` 是一个命名 URL 模式,它带有一个名为 `slug` 的参数。
6. Django模板的变量
除了 Django 模板内置的过滤器和标签之外,我们还可以使用模板变量。我们可以通过几种方式在模板中传递变量。
6.1 直接在模板中定义变量
我们可以直接在模板中定义变量,然后使用变量标签将其显示出来。
{% with name="John Smith" %}
{{ name }}
{% endwith %}
在这个例子中,我们使用 `with` 标签为变量 `name` 定义了一个值。使用 `{{ name }}` 变量标签将其显示出来。
6.2 上下文字典传递变量
我们还可以通过使用上下文字典传递变量。在上下文字典中,键是变量名称,值是变量的值。当渲染模板时,我们可以使用这个上下文字典来提供变量。
def my_view(request):
context = {'name': 'John Smith'}
return render(request, 'my_template.html', context=context)
在上面的例子中,我们从视图函数向上下文字典中添加一个 `name` 变量。在模板中,我们可以使用变量标签将其显示出来。
{{ name }}
7. 模板中的逻辑控制
我们经常需要根据条件显示模板中的内容。我们可以使用模板标签中的逻辑控制。
7.1 if 语句
通过 if 标签,我们可以在模板中执行 if 语句。这个语句与 Python 语言中的 if 语句非常相似。
{% if username %}
Welcome {{ username }}!
{% else %}
Please log in
{% endif %}
在上面的例子中,我们根据用户是否已登录,决定输出的内容。
7.2 for 循环嵌套 if 语句
我们经常需要使用 for 循环嵌套 if 语句来控制模板中的显示。例如,我们可以根据某些条件过滤列表中的元素,然后用循环将其显示出来。
{% for item in items %}
{% if item.show %}
{{ item.name }}
{% endif %}
{% endfor %}
在上面的例子中,我们使用 for 循环迭代列表中的元素。通过 if 语句,我们只显示满足特定条件(item.show)的元素。
总结
本文中,我们讨论了 Django 模板及其语法、标签和过滤器。我们还介绍了模板继承、全局变量和变量的使用,以及逻辑控制。
Django 模板是一个强大而灵活的工具,可以帮助我们创建高度可定制的 Web 应用程序。如果你刚开始使用 Django,模板是一个值得深入学习的领域。