乐趣区

关于python:Python-Django-模版全解与实战

本文首先介绍了 Django 模板零碎的基础知识,接着探讨了如何装置和配置 Django 模板零碎,而后深刻解析了 Django 模板的根本构造、标签和过滤器的用法,论述了如何在模板中展现模型数据,最初应用一个理论我的项目的例子来演示如何在理论开发中应用 Django 模板零碎。

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 模板次要应用两种语法:

  • 变量:用双大括号({{}})包裹。比方{{variable}},Django 将会将其替换为变量的值。
  • 标签:用大括号和百分号({% %})包裹。标签提供了模板的控制结构,比方循环、条件语句等。比方{% for item in list %}...{% endfor %}

模板继承

Django 模板零碎反对模板继承。这是一种 DRY(Don’t Repeat Yourself)的设计准则。你能够定义一个根底模板(base template),而后让其余模板继承这个根底模板并笼罩其中的某些局部。

例如,定义一个根底模板base.html

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

而后,定义一个子模板 child.html,继承base.html 并笼罩 content 块:

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

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

其余模板

除了继承,Django 模板还反对蕴含(include)其余模板,这能够帮忙你将模板合成为小的、可重用的局部。

例如,定义一个模板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 模板零碎中的标签(Tags)提供了各种控制结构,包含循环、条件语句、模板继承等。接下来咱们具体介绍一些罕用的标签。

for 标签

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 %}

extends 标签和 block 标签

extends标签用于模板继承,block标签用于定义可被子模板笼罩的区块:

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

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

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

include 标签

include标签用于蕴含其余模板,使得模板可重用:

{% include "header.html" %}

url 标签

url标签用于生成 URL。它承受一个视图函数的名称或 URL 模式的名称,以及可选的参数,而后返回对应的 URL:

<a href="{% url'home'%}">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 -->

应用 lower 过滤器将文本转换为小写:

{{"Hello World"|lower}} <!-- 输入: hello world -->

链接过滤器

你还能够链接多个过滤器,他们会依照从左到右的程序执行:

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

自定义过滤器

除了应用 Django 内置的过滤器,你还能够创立本人的过滤器。为此,你须要在某个利用下的 templatetags 目录中创立一个 Python 文件,而后在其中定义你的过滤器函数,并应用 register.filter 装璜器注册它:

from django import template

register = template.Library()

@register.filter
def my_filter(value):
    # 这是一个简略的过滤器,它返回值的第一个字符
    return value[0]

而后你就能够在模板中应用这个过滤器了:

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

Django 模板中展现模型数据

Django 框架将模型数据和模板视图拆散,这让咱们在模板中不便地展现模型数据。在视图函数中,咱们能够查问模型数据,而后将它传递给模板。在模板中,咱们应用非凡的语法来拜访和展现这些数据。

在视图中筹备数据

假如咱们有一个 Blog 模型,它有一个 title 字段和一个 content 字段。在咱们的视图函数中,咱们能够查问所有的博客:

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 标签来遍历所有的博客,并应用变量语法来展现每个博客的题目和内容:

{% 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 %}

在理论的我的项目中应用 Django 模板

Django 模板零碎在理论的我的项目开发中扮演着重要的角色。上面咱们就以一个简略的博客零碎作为例子,演示如何在理论我的项目中应用 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)  # 公布日期

第二步:创立视图

接着,咱们须要创立一个视图来解决用户的申请。在这个视图中,咱们能够获取所有的博客文章,并将它们传递给模板:

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})  # 将文章传递给模板

第三步:编写模板

而后,咱们能够创立一个模板来展现博客文章。在这个模板中,咱们应用 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 %}

第四步:配置 URLs

最初,咱们须要在 urls.py 文件中配置 URL,使得用户能够拜访咱们的视图:

from django.urls import path
from . import views

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

以上就是在理论我的项目中应用 Django 模板的根本步骤。通过这个例子,咱们能够看到 Django 模板零碎的弱小和灵活性,它能够帮忙咱们疾速地创立动静的网页。


如有帮忙,请多关注
集体微信公众号:【Python 全视角】
TeahLead_KrisChang,10+ 年的互联网和人工智能从业教训,10 年 + 技术和业务团队治理教训,同济软件工程本科,复旦工程治理硕士,阿里云认证云服务资深架构师,上亿营收 AI 产品业务负责人。

退出移动版