Code前端首页关于Code前端联系我们

Python Django模板系统完整讲解及实例演示

terry 2年前 (2023-09-24) 阅读数 61 #后端开发

首先介绍Django模板系统的基础知识,然后讨论如何安装和管理Django模板系统,然后分析Django模板的基本结构,标签和过滤器的使用,讲解如何在模板中展示模型数据,最后用一个真实的项目例子来演示如何在实际开发中使用Django Template系统。

Django模板系统简介

Django模板系统是一个功能强大的组件,它允许我们根据我们提供的数据动态生成HTML和XML等结构化文本。模板系统不仅易于使用,而且功能丰富。它包含一种内置语言:Django 模板语言(DTL),一种简单、非侵入性的语言,用于定义模板的结构和逻辑。

例如,在Django模板中,我们可以使用变量和标签来动态生成内容:

# Django模板示例
{{ book.title }} <!-- 输出: Python编程基础 -->
{% if user.is_authenticated %} <!-- 如果用户已登录 -->
  Hello, {{ user.username }}! <!-- 输出: Hello, John! -->
{% endif %}

在上面的代码中,大括号{{ }}用于生成值变量和标签 {% %} 用于执行逻辑运算。


模板基本结构

Django 模板是由一系列特殊语法组成的文本文件,用于动态生成 HTML、XML 或其他标记语言。让我们仔细看看 Django 模板的基本结构。

模板语法

Django 模板主要使用两种语法:

  • 变量:用双大括号 ({{ }}) 括起来。例如,{{变量}},Django会将其替换为变量的值。
  • 标签:用括号和百分号 ({% %}) 括起来。标签提供模板控制结构,例如循环、条件语句等。例如,{% for 列表 % 中的项目}...{% endfor %}

模板继承

Django 模板系统支持模板继承。这就是DRY(Don’t Repeat Yourself)的设计原则。您可以定义一个基本模板,然后允许其他模板继承此基本模板并更改该模板的某些部分。

例如,定义一个基本模板 base.html

<!-- base.html -->
<html>
<body>
{% block content %}{% endblock %}
</body>
</html>

然后,定义一个子模板 child.html,♻♻ 并加入 Close 内容块:

<!-- child.html -->
{% extends "base.html" %}

{% block content %}
<p>Hello, Django!</p>
{% endblock %}

其他模板

除了继承之外,Django模板还支持包含其他模板,这可以帮助您将模板分解为更小的可重用部分。

例如定义模板header.html

<!-- header.html -->
<header>
  <h1>Welcome to My Website</h1>
</header>

然后,将此模板放入另一个模板中:

{% include "header.html" %}

<p>This is the main content...</p>

Django 模板配置 Django 模板配置

Django 模板 系统为默认包含在 Django 项目中。您可以在文件settings.py项目中找到模板配置信息:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        ...
    },
]

您可以在配置项'DIRS'中添加模板的路径。默认情况下,Django 在每个 templates 应用程序目录中查找模板文件。

配置模板的加载方式

Django 的模板系统可以从多个位置加载模板。默认情况下,Django 在每个 templates 应用程序目录中查找模板文件。您可以通过修改 TEMPLATES 配置中的 'DIRS' 选项来添加其他模板目录。例如,您可以添加全局模板目录:

# settings.py

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]

在此配置中,所有模板文件都将在项目根目录下的文件夹templates 中找到。

配置模板引擎

TEMPLATES配置中,'BACKEND'❀用于指定引擎选择。 Django 默认使用自己的模板引擎,即 django.template.backends.django.DjangoTemplates。你也可以切换到其他模板引擎,比如Jinja2:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        ...
    },
]

注意,不同的模板引擎需要不同的配置,提供的模板语言也不同。

配置自定义模板标签和过滤器

如果您有自定义模板标签和过滤器,则必须将它们放置在应用程序的 templatetags 目录中。然后在配置中添加应用程序INSTALLED_APPS,Django会自动加载你自定义的模板标签和过滤器:

# settings.py

INSTALLED_APPS = [
    ...
    'myapp',
    ...
]

Django标签模板详细说明

各种Django模板中都有标签(Tag System)。包括控制结构,包括循环、条件语句、模板继承等。接下来我们详细介绍一些常用的标签。标签

对应标签

for 用于圈出模板中的序列:

{% for item in item_list %}
    <p>{{ item.name }}</p> <!-- 输出每个项目的名称 -->
{% endfor %}

if 标签

if 用于条件考虑标签。可以使用elifelse进行多分支判断:

{% if user.is_authenticated %}
    <p>Welcome back, {{ user.username }}.</p> <!-- 如果用户已经认证,打印欢迎信息 -->
{% else %}
    <p>Please log in.</p> <!-- 如果用户未认证,提示用户登录 -->
{% endif %}

扩展标签和块标签

扩展,使用 块标签是用于指定子模板可以包含的块:

<!-- base.html -->
<html>
<body>
{% block content %}{% endblock %}
</body>
</html>

<!-- child.html -->
{% extends "base.html" %}

{% block content %}
<p>Hello, Django!</p>
{% endblock %}

include 标签

include 标签用于包含其他模板,使模板可重复使用: ❀ 标签 url

已使用来生成 URL。它接受显示函数名称或 URL 模式名称以及可选参数,并返回相应的 URL:

<a href="{%%20url%20'home'%20%}">Home</a> <!-- 生成首页的URL -->

csrf_token 标签

使用 POST 表单时,csrf_token❀ 标签 用于生成用于防止跨站点请求伪造攻击的 CSRF 令牌:

<form method="post">
{% csrf_token %}
<!-- 表单内容 -->
</form>

模板过滤器

在 Django 模板中,过滤器可以在显示变量之前对其进行修改。过滤器的语法是在变量名称后面添加竖斜杠 (|) 和过滤器名称。如果过滤器需要参数,可以使用分号 (:) 添加它们。我们来详细了解一下。

实际使用

例如,我们可以使用过滤器date来更改日期格式:

{{ date_var|date:"F j, Y" }} <!-- 输出: July 8, 2023 -->

使用过滤器date来更改日期格式: 以下情况: 链接过滤器

您还可以链接各种过滤器,它们将从左到右按顺序执行:

{{ "Hello World"|lower|capfirst }} <!-- 输出: Hello world -->

自定义过滤器

除了使用 Django 的内置过滤器之外,您还可以还可以制作自己的过滤装置。为此,您需要在应用程序的目录 templatetags 中创建一个 Python 文件,然后定义过滤器函数并将其注册到 register.filter 装饰器: ♻ 然后就可以在模板中使用这个过滤器了:

{{ "Hello World"|my_filter }} <!-- 输出: H -->

在 Django 模板中显示模型数据

Django 框架将模型数据和模板视图分开,这使得我们可以轻松地在模板中显示模型数据。在视图函数中我们可以查询模型数据然后将其传递给模板。在模板中,我们使用特殊语法来访问和显示这些数据。

在视图中准备数据

假设我们有一个具有title字段的模型。在显示功能中,我们可以查询所有博客:

from django.shortcuts import render
from .models import Blog

def blog_list(request):
    blogs = Blog.objects.all()  # 查询所有的博客
    return render(request, 'blog_list.html', {'blogs': blogs})

在模板中显示数据

然后,在blog_list.html模板中,我们可以使用

。迭代所有博客,并使用变量语法显示每个博客的标题和内容:

{% for blog in blogs %}
<h2>{{ blog.title }}</h2>  <!-- 展示博客标题 -->
<p>{{ blog.content }}</p>  <!-- 展示博客内容 -->
{% endfor %}

使用过滤器格式化数据

在模板中,我们还可以使用过滤器来格式化模型数据。例如,我们可以使用过滤器date来更改日期格式,或者truncatechars来限制文本长度:

{% for blog in blogs %}
<h2>{{ blog.title }}</h2>
<p>{{ blog.publish_date|date:"F j, Y" }}</p>  <!-- 使用date过滤器格式化发布日期 -->
<p>{{ blog.content|truncatechars:100 }}</p>  <!-- 使用truncatechars过滤器限制内容长度 -->
{% endfor %}

使用DjangoReal模板。模板系统在实际项目开发中发挥着重要作用。下面我们将以一个简单的博客系统为例,演示如何在实际项目中使用Django模板。

第一步:定义模型

首先,我们需要在应用程序中定义一个模型。在此示例中,我们定义一个模型 Post 来表示博客文章:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)  # 文章标题
    content = models.TextField()  # 文章内容
    pub_date = models.DateTimeField(auto_now_add=True)  # 发布日期

步骤 2:创建视图

接下来,我们需要创建一个视图来处理用户请求。在此视图中,我们可以获取所有博客文章并将它们发送到模板:

from django.shortcuts import render
from .models import Post

def post_list(request):
    posts = Post.objects.all()  # 获取所有的博客文章
    return render(request, 'blog/post_list.html', {'posts': posts})  # 将文章传递给模板

步骤 3:编写模板

然后我们可以创建一个模板来显示博客文章。在这个模板中,我们使用标签for来遍历所有文章,并使用变量来显示文章的标题和内容:

{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
<p>Published on {{ post.pub_date|date:"F j, Y" }}</p>
{% endfor %}

第四步:配置URL

最后,我们需要在文件 urls.py

中配置URL,以便用户可以访问我们的视图:

from django.urls import path
from . import views

urlpatterns = [
    path('posts/', views.post_list, name='post_list'),  # 当用户访问/posts/时,显示博客文章列表
]

以上是在实际项目中使用Django模板的基本步骤。通过这个例子,我们可以看到Django模板系统的强大和灵活性,它可以帮助我们快速创建动态网页。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门