Python Django教程之模板的使用

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` 全局变量在模板中添加这个令牌。

{% csrf_token %}

5.2 settings

`settings` 全局变量可以让我们在模板中访问 Django 项目中的设置。例如,我们可以访问 `MEDIA_URL` 和 `STATIC_URL`。

{{ settings.MEDIA_URL }}

{{ settings.STATIC_URL }}

5.3 url

`url` 全局变量允许我们构建带有参数的 URL。

{{ post.title }}

在这个例子中,我们使用 `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,模板是一个值得深入学习的领域。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签