Django系列 | [3]模板

时间:2023-02-23 15:58:45

Django模板是Django Web框架的一部分,它允许我们在Web应用程序中使用动态内容。模板是包含静态文本和动态变量的HTML文件,其中动态变量将在渲染模板时替换为实际值。在本教程中,我们将学习Django模板的基础知识,包括如何定义和使用模板变量、控制流语句和模板继承。

什么是Django模板?

Django模板是包含HTML、CSS和JavaScript等静态内容以及Django模板语言(DTL)标记的文本文件。DTL是一种简单的语言,允许我们在模板中包含动态内容。在渲染模板时,DTL标记将被替换为实际值。

以下是一个简单的Django模板示例:

<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ heading }}</h1>
{% if items %}
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% else %}
<p>No items found.</p>
{% endif %}
</body>
</html>

在这个例子中,我们定义了一个HTML文档,其中包含了两个DTL变量:{{ title }}和{{ heading }}。我们还使用了控制流语句,如{% if %}和{% for %},来控制模板的显示方式。

如何在Django中使用模板?

要在Django中使用模板,我们需要完成以下三个步骤:

  1. 定义模板:创建一个包含HTML和DTL标记的文本文件。
  2. 渲染模板:将模板变量替换为实际值,并将模板转换为最终的HTML输出。
  3. 返回响应:将HTML输出作为HTTP响应发送回客户端。

定义模板

要定义Django模板,我们需要创建一个HTML文件,并使用DTL标记将动态内容插入到HTML文件中。以下是一个简单的模板示例:

<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ heading }}</h1>
{% if items %}
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% else %}
<p>No items found.</p>
{% endif %}
</body>
</html>

在这个例子中,我们定义了一个包含三个DTL变量和一个控制流语句的HTML文件。变量包含在{{}}中,控制流语句使用{% %}。

渲染模板

要渲染Django模板,我们需要使用Django的模板引擎。Django的模板引擎允许我们将模板变量替换为实际值,并将模板转换为最终的HTML输出。以下是一个简单的示例:

from django.shortcuts import render

def my_view(request):
items = ['Item 1', 'Item 2', 'Item 3']
context = {'title': 'My Page', 'heading': 'Welcome', 'items': items}
return render(request, 'my_template.html', context)

在这个例子中,我们定义了一个视图函数my\_view,它返回一个包含标题、标题和项目列表的字典context。我们使用render函数来将模板渲染为最终的HTML输出。

返回响应

要将HTML输出作为HTTP响应发送回客户端,我们可以使用Django的HttpResponse类。以下是一个简单的示例:

from django.http import HttpResponse
from django.template import loader

def my_view(request):
items = ['Item 1', 'Item 2', 'Item 3']
context = {'title': 'My Page', 'heading': 'Welcome', 'items': items}
template = loader.get_template('my_template.html')
html = template.render(context, request)
return HttpResponse(html)

在这个例子中,我们使用loader.get\_template函数获取模板,并使用模板的render方法将模板渲染为HTML输出。最后,我们将HTML输出作为HttpResponse对象返回。

模板变量

模板变量是Django模板中最常见的DTL标记之一。它允许我们在模板中包含动态内容,如数据库中的数据或用户输入。以下是一个模板变量的例子:

<p>Welcome, {{ user.username }}!</p>

在这个例子中,我们使用模板变量{{ user.username }}将用户的用户名插入到HTML文本中。

要在视图函数中设置模板变量,我们可以将变量添加到上下文字典中,如下所示:

def my_view(request):
user = request.user
context = {'user': user}
return render(request, 'my_template.html', context)

在这个例子中,我们将request对象的user属性添加到上下文字典中,并将其传递给render函数。

控制流语句

控制流语句允许我们在Django模板中使用条件语句和循环语句。以下是一个if语句的例子:

{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}!</p>
{% else %}
<p>Please log in.</p>
{% endif %}

在这个例子中,我们使用控制流语句{% if %}和{% else %}来检查用户是否已经登录,并相应地显示欢迎消息或登录提示。

以下是一个循环语句的例子:

<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>

在这个例子中,我们使用控制流语句{% for %}和{% endfor %}来循环遍历一个列表,并将每个元素插入到HTML文本中。

模板继承

模板继承允许我们创建一个基本模板,其中包含所有页面都需要的共同元素,如页眉、页脚和导航栏。然后,我们可以从基本模板派生出其他模板,用于特定的页面。

以下是一个基本模板的示例:

<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<header>
{% block header %}
<h1>My Site</h1>
{% endblock %}
</header>
<nav>
{% block nav %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about/">About</a></li>
<li><a href="/contact/">Contact</a></li>
</ul>
{% endblock %}
</nav>
<main>
{% block content %}{% endblock %}
</main>
<footer>
{% block footer %}
<p>Copyright © {{ year }} My Site</p>
{% endblock %}
</footer>
</body>
</html>

在这个例子中,我们定义了一个基本模板,它包含了一个标题块、页眉块、导航块、内容块和页脚块。注意,在每个块中,我们使用了{% block %}和{% endblock %}标记,这些标记定义了可以在子模板中替换的部分。

以下是一个使用基本模板的子模板的示例:

{% extends "base.html" %}

{% block title %}About{% endblock %}

{% block content %}
<h2>About Us</h2>
<p>We are a small company located in New York City.</p>
{% endblock %}

在这个例子中,我们使用{% extends %}标记指示Django使用基本模板,并在子模板中定义了标题块和内容块。注意,在子模板中,我们可以使用{% block %}标记覆盖父模板中的块。

过滤器

过滤器是Django模板语言中的另一种常见元素。它们允许我们修改模板变量的值,以便在模板中显示更好的格式。以下是一些常用的过滤器:

  • {{ value|lower }}:将字符串转换为小写。
  • {{ value|upper }}:将字符串转换为大写。
  • {{ value|title }}:将字符串转换为标题形式(每个单词首字母大写)。
  • {{ value|length }}:返回列表、元组或字符串的长度。
  • {{ value|date:"D d M Y" }}:将日期格式化为"Mon 01 Jan 2019"格式。

以下是一个使用过滤器的示例:

<p>{{ title|upper }}</p>

在这个例子中,我们使用过滤器将变量title转换为大写形式,然后将其插入到HTML文本中。

要在视图函数中设置过滤器,我们可以在变量值之后使用管道(|)字符

循环和条件语句

Django模板语言还支持循环和条件语句。以下是一些常用的控制流语句:

  • {% if %}:如果条件成立,则执行模板块中的代码。
  • {% else %}:如果前面的{% if %}条件不成立,则执行此模板块中的代码。
  • {% elif %}:在{% if %}条件不成立的情况下,如果此条件成立,则执行此模板块中的代码。
  • {% endif %}:结束{% if %}块。
  • {% for %}:在循环中迭代序列,并执行模板块中的代码。
  • {% endfor %}:结束{% for %}块。

以下是一个使用条件语句的示例:

{% if user.is_authenticated %}
<p>Welcome back, {{ user.username }}!</p>
{% else %}
<p>Please log in to access your account.</p>
{% endif %}

在这个例子中,我们使用{% if %}语句检查用户是否已通过身份验证,并根据结果显示不同的文本。我们还可以使用{% else %}语句在条件不成立时显示其他文本。

以下是一个使用循环语句的示例:

{% for item in items %}
<li>{{ item }}</li>
{% endfor %}

在这个例子中,我们使用{% for %}语句迭代items序列中的每个项,并在列表中显示每个项。

静态文件

在Web开发中,静态文件(如样式表、JavaScript文件和图像)是页面的重要组成部分。Django有一个内置的静态文件管理器,允许我们在模板中引用静态文件。

首先,在settings.py文件中设置STATIC\_URL和STATICFILES\_DIRS:

STATIC_URL = '/static/'

STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]

在模板中引用静态文件时,我们可以使用{% static %}模板标记:

<link rel="stylesheet" type="text/css" href="{% static 'css/styles.css' %}">

在这个例子中,我们使用{% static %}模板标记引用一个名为styles.css的样式表,该样式表位于我们的静态文件目录中的css子目录中。

我们还可以使用{% load static %}模板标记加载静态文件标记库。这允许我们使用{% static %}标记而无需在每个标记前面添加STATIC\_URL前缀。

{% load static %}

<link rel="stylesheet" type="text/css" href="{% static 'css/styles.css' %}">

总结

在本教程中,我们学习了Django模板语言的基础知识。我们了解了模板标记、过滤器、控制流语句和静态文件管理。使用这些工具,我们可以创建动态、交互式的Web应用程序,同时保持代码的可维护性和可读性。