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
标签用于条件判断。你可以使用elif
和else
进行多分支判断:
{% 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 模版全解与实战的更多相关文章
- [转载] Python数据类型知识点全解
[转载] Python数据类型知识点全解 1.字符串 字符串常用功能 name = 'derek' print(name.capitalize()) #首字母大写 Derek print(name.c ...
- The Python Challenge 谜题全解(持续更新)
Python Challenge(0-2) The Python Challengehttp://www.pythonchallenge.com/ 是个很有意思的网站,可以磨练使用python的技巧, ...
- Python Django CMDB项目实战之-1如何开启一个Django-并设置base页、index页、文章页面
1.环境 win10 python 2.7.14 django 1.8.2 需要用到的依赖包:MySQLdb(数据库的接口包).PIL/pillow(处理图片的包) 安装命令: pip install ...
- Python+Django+ansible playbook自动化运维项目实战☝☝☝
Python+Django+ansible playbook自动化运维项目实战☝☝☝ 一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...
- Python.Django视频教程(全13集)
Python.Django视频教程(全13集)教程目录: 下载地址:http://www.fu83.cn/thread-205-1-1.html
- Python Django CMDB项目实战之-3创建form表单,并在前端页面上展示
基于之前的项目代码 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页.index页.文章页面 Python Django CMDB项目实战之-2创建APP. ...
- Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据
基于之前的项目代码来编写 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页index页文章页面 现在我们修改一个文章列表是从数据库中获取数据, 下面我们就需 ...
- 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)
Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...
- 从零开始部署Django生产环境(适用:《跟老齐学Python Django实战》)
<跟老齐学Python Django实战>作为市面上少有的Django通俗实战书籍,给了我学习Django很大的帮助.作为一名新入门的菜鸟,全书我重复练习了至少三遍,每次都有新的收获. 前 ...
- Python+Django+ansible playbook自动化运维项目实战✍✍✍
Python+Django+ansible playbook自动化运维项目实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受 ...
随机推荐
- 【杂绪】#4 & 【Diary】CSP-S1 2021 游记(慎) & CSP-S 备赛发狂日记
减少..减少掉 我没法同时做那么多事情了........ -------------------------------------------- 但是我\(\color{#EEEEEE}{真真切切地 ...
- 随手记:lnmp 安装完 redis 后无法全局操作
说明redis-server不是全局命令,那么假如到全局即可 假设redis安装目录是:/usr/local/redis/bin/redis-cli ln -s /usr/local/redis/b ...
- 【Spring5】JdbcTemplate
JdbcTemplate实现对数据库增删改查 步骤 导入Jar包 mysql-connector-java-8.0.28.jar:mysql数据库连接的相关依赖 spring-tx-5.2.6.REL ...
- 2021年蓝桥杯python真题-路径(数论+动态规划)(LCM、GCD和DP详细介绍)干货满满~
欢迎大家阅读本文章 如果大家对LCM和GCD不是很熟悉,这篇文章将对你有帮助! 本文章也会把动态规划做一定的介绍 题目: GCD和LCM的讲解: GCD的实现-辗转相除法: 在数学中,辗转相除法,又称 ...
- java LocalDateTime的使用
1.LocalDateTime的基本使用 //获取当前时间 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println( ...
- 2022-06-02:一开始在0位置,每一次都可以向左或者向右跳, 第i次能向左或者向右跳严格的i步。 请问从0到x位置,至少跳几次可以到达。 来自字节。 力扣754. 到达终点数字。
2022-06-02:一开始在0位置,每一次都可以向左或者向右跳, 第i次能向左或者向右跳严格的i步. 请问从0到x位置,至少跳几次可以到达. 来自字节. 力扣754. 到达终点数字. 答案2022- ...
- 2021-12-16:给定两个数a和b, 第1轮,把1选择给a或者b, 第2轮,把2选择给a或者b, ... 第i轮,把i选择给a或者b。 想让a和b的值一样大,请问至少需要多少轮? 来自字节跳动。
2021-12-16:给定两个数a和b, 第1轮,把1选择给a或者b, 第2轮,把2选择给a或者b, - 第i轮,把i选择给a或者b. 想让a和b的值一样大,请问至少需要多少轮? 来自字节跳动. 答案 ...
- 【论文笔记】Deeplab系列
[深度学习]总目录 DeepLab系列是谷歌团队提出的一系列语义分割算法.DeepLab v1于2014年推出,随后2017到2018年又相继推出了DeepLab v2,DeepLab v3以及Dee ...
- Serverless冷扩机器在压测中被击穿问题
一.现象回顾 在今天ForceBot全链路压测中,有位同事负责的服务做Serverless扩容(负载达到50%之后自动扩容并上线接入流量)中,发现新扩容的机器被击穿,监控如下(关注2:40-3:15时 ...
- .Net8顶级技术:IR边界检查之IR解析(二)
前言 IR技术应用在各个编程语言当中,它属于JIT的核心部分,确实有点点麻烦.但部分基本明了.本篇通过小例子了解下.前情提要,看这一篇之前建议看看前一篇:点击此处,以便于理解. 概括 1.前奏 先上C ...