|
本文首先介绍了Django模板系统的基础知识,接着探讨了如何安装和配置Django模板系统,然后深入解析了Django模板的基本结构、标签和过滤器的用法,阐述了如何在模板中展示模型数据,最后使用一个实际项目的例子来演示如何在实际开发中使用Django模板系统。
Django模板系统的简介
Django模板系统是一个强大的组件,它允许我们根据所提供的数据动态生成HTML、XML等结构化文本。模板系统不仅易于使用,且功能丰富。它包括一个内置的语言:Django模板语言 (DTL),这是一种简单、非侵入式的语言,用于定义模板的结构和逻辑。
例如,在一个Django模板中,我们可以使用变量和标签来动态地生成内容:- # Django模板示例
- {{ book.title }}
- {% if user.is_authenticated %}
- Hello, {{ user.username }}!
- {% endif %}
复制代码 以上代码中,花括号{{ }}用于输出变量的值,标签{% %}用于执行逻辑操作。
模板的基本结构
Django模板是由一系列特殊的语法构成的文本文件,用于动态生成HTML、XML或其他标记语言。下面我们来详细了解一下Django模板的基本结构。
模板语法
Django模板主要使用两种语法:
- 变量:用双大括号({{ }})包裹。比如{{ variable }},Django将会将其替换为变量的值。
- 标签:用大括号和百分号({% %})包裹。标签提供了模板的控制结构,比如循环、条件语句等。比如{% for item in list %}...{% endfor %}。
模板继承
Django模板系统支持模板继承。这是一种DRY(Don't Repeat Yourself)的设计原则。你可以定义一个基础模板(base template),然后让其他模板继承这个基础模板并覆盖其中的某些部分。
例如,定义一个基础模板base.html:- <html>
- <body>
- {% block content %}{% endblock %}
- </body>
- </html>
复制代码 然后,定义一个子模板child.html,继承base.html并覆盖content块:- {% extends "base.html" %}
- {% block content %}
- <p>Hello, Django!</p>
- {% endblock %}
复制代码 其他模板
除了继承,Django模板还支持包含(include)其他模板,这可以帮助你将模板分解为小的、可重用的部分。
例如,定义一个模板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标签用于定义可被子模板覆盖的区块:- <html>
- <body>
- {% block content %}{% endblock %}
- </body>
- </html>{% extends "base.html" %}
- {% block content %}
- <p>Hello, Django!</p>
- {% endblock %}
复制代码 include标签
include标签用于包含其他模板,使得模板可重用:- {% include "header.html" %}
复制代码 url标签
url标签用于生成URL。它接受一个视图函数的名称或URL模式的名称,以及可选的参数,然后返回对应的URL:- <a target="_blank" href="https://www.cnblogs.com/{% url 'home' %}">Home</a>
复制代码 csrf_token标签
在使用POST表单时,csrf_token标签用于生成CSRF令牌,以防止跨站请求伪造攻击:- <form method="post">
- {% csrf_token %}
- </form>
复制代码 模板过滤器
在Django模板中,过滤器可以在变量被显示之前对其进行修改。过滤器的语法是在变量名后面添加一个竖线(|)和过滤器的名称。如果过滤器需要参数,可以使用冒号(:)添加。让我们详细了解一下。
基本使用
比如,我们可以使用date过滤器来格式化日期:- {{ date_var|date:"F j, Y" }}
复制代码 使用lower过滤器将文本转换为小写:- {{ "Hello World"|lower }}
复制代码 链接过滤器
你还可以链接多个过滤器,他们会按照从左到右的顺序执行:- {{ "Hello World"|lower|capfirst }}
复制代码 自定义过滤器
除了使用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 }}
复制代码 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>
- <p>{{ blog.content|truncatechars:100 }}</p>
- {% 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产品业务负责人。
来源:https://www.cnblogs.com/xfuture/p/17537479.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|