首页 > 编程语言 >Python Django 模版全解与实战

Python Django 模版全解与实战

时间:2023-07-08 16:55:38浏览次数:35  
标签:Python 标签 Django content html 过滤器 全解 模板

本文首先介绍了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产品业务负责人。

标签:Python,标签,Django,content,html,过滤器,全解,模板
From: https://www.cnblogs.com/xfuture/p/17537479.html

相关文章

  • 「Python实用秘技15」pandas中基于范围条件进行表连接
    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills这是我的系列文章「Python实用秘技」的第15期,本系列立足于笔者日常工作中使用Python积累的心得体会,每一期为大家带来一个几分钟内就可学会的简单小技巧。作为系列第1......
  • python高级语法笔记
    5.python高级一/demo03_python环境变量路径.pyfromloguruimportloggerimportsyssys.path.append('/Users/toby/Downloads/PythonAdvanced/code/pythonAdvanced5Verify')forpathinsys.path:logger.debug(path)5.python高级一/demo09_xxxsetter和xxxdeleter装饰......
  • python闭包_装饰器
    6.python高级知识-闭包装饰器/demo02_闭包.py#-*-coding:utf-8-*-#第一种方法================================#每次都更具汇率和钱都写一遍#这种方法是太烦了print("第一种方法")rate_usa=0.7money=100#print(rate_usa*money)print("第一种方法结束")#......
  • python创建类似于wx.EVT_BUTTON这样的自定义事件
    想要创建类似于wx.EVT_BUTTON这样的自定义事件,可以通过定义一个继承自wx.PyEvent的子类,并在其中添加自定义的事件类型。下面是一个示例代码:importwx#创建自定义事件类型MY_EVENT_TYPE=wx.NewEventType()EVT_MY_EVENT=wx.PyEventBinder(MY_EVENT_TYPE,1)#创建自定义......
  • Python socket编程(转载)
    Pythonsocket编程https://www.cnblogs.com/linhaifeng/articles/6129246.html套接字工作流程服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,......
  • 从零用python flask框架写一个简易的网站
    要用Python写一个网站,你可以使用Python的Web框架来开发。常见的PythonWeb框架包括Django、Flask、Bottle等。以下是一个简单的使用Flask框架开发的示例。1.安装Flask在开始开发之前,你需要安装Flask框架。你可以使用以下命令来安装:pipinstallflask2.创建Flask应用在安装......
  • python: create animated GIF
    #-*-coding:UTF-8-*-#encoding:utf-8#-*-coding:UTF-8-*-#版权所有2023©涂聚文有限公司#许可信息查看:#描述:#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python11#Datetime:2023/7/511:08#User:geovindu#Prod......
  • python中偏导数Partial使用方法
    partial()偏函数partial是Pythonfunctools模块中的一个高级函数。它对普通函数进行封装,主要功能是把一个函数的部分参数给固定住,返回一个新的函数。通俗点说,就是冻结原函数的某些参数。该函数形式如下:functools.partial(func[,*args][,**kwargs])其中func是定义的函数。......
  • 高级编程技巧揭秘!精通Python装饰器,打造灵活强大的代码结构!
    装饰器是Python中一种强大而灵活的编程技巧,它可以用于修改或扩展函数的行为,同时又不需要修改函数的源代码。本文将介绍Python中的装饰器的基本概念、使用方法以及高级技巧,帮助你从入门到精通装饰器的使用。一、基本概念在深入学习装饰器之前,我们首先需要了解一些基本概念。1.1......
  • Python内置函数zip()的用法
    zip()函数介绍:zip()函数是Python的内置函数,将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的list(Python3为了节约内存,zip()返回的是zip对象,需要通过list()手动转换成列表)如果zip()没有可迭代的元素,则它将返回一个空的迭代器,如果每个迭代器......