[Python]Django模板的配置及其语法(二)

简介: [Python]Django模板的配置及其语法(二)

6. 模板继承

模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量。

父模板:

如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。

标签block:

用于在父模板中预留区域,留给子模板填充差异性的内容,预留区域的名字不能相同。 为了更好的可读性,建议给endblock标签也写上名字,这个名字与对应的block名字相同。父模板中也可以使用传递过来的数据。

语法:

{% block 名称 %}
  预留区域,可以编写默认内容,也可以不编写默认内容
{% endblock 名称 %}

子模板:

标签extends:继承,写在子模板文件的第一行。

语法:

{% extends "父模板路径" %}

填充父模板中指定名称的预留区域。

子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值。

{% block 名称 %}
  重写预留区域
{% endblock 名称 %}

父模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
        {% block title %}
            页面标题
        {% endblock title %}
    </title>
</head>
<body>
    {% block header %}
        <h1>页面的顶部</h1>
    {% endblock header %}
    {% block main %}
        <h1>页面的主要部分</h1>
    {% endblock main %}
    {% block footer %}
        <h1>页面的底部</h1>
    {% endblock footer %}
</body>
</html>

继承父模板重写index.html:

{# 继承父模板 #}
{% extends "base.html" %}
{# 重写页面标题区域 #}
{% block title %}
    张三的个人介绍
{% endblock title %}
{# 重写页面的主体区域 #}
{% block main %}
    <h1>hello world</h1>
    {#  name 为模板等待接收的数据,需要View查询数据库传入模板  #}
    <h1>你好 {{ name }}</h1>
    <p>年龄:{{ age }}</p>
    <p>
        {% if age < 10 %}
            年龄小于10
        {% elif age >= 10 and age < 20 %}
            年龄大于10小于20
        {% else %}
            年龄大于20
        {% endif %}
    </p>
    <p>生日:{{ birthday|date:'Y-m-d H:i:s' }}</p>
    <p>朋友:</p>
    <ul>
        {#    for 循环    #}
        {% for friend in friends %}
            {#    forloop.counter 获取循环的次序,forloop.count0 获取下标    #}
            <li>{{ forloop.counter }} {{ forloop.counter0 }} {{ friend }}</li>
        {% endfor %}
    </ul>
    {#  获取列表中的某个元素,使用点+下标的方式进行获取  #}
    <p>女朋友:{{ friends.2 }}</p>
    {#  获取字典中的某个元素,使用点+key的形式获取  #}
    <p>第一年的薪资:{{ money.2019 }}</p>
{% endblock %}
{# 不需要底部区域,重写底部区域 #}
{% block footer %}{% endblock %}

7. jinja2模板

Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,尤其是Flask框架内置的模板语言。

7.1 安装jinja2模板

pip install jinja2
pip3 install jinjia2 -i https://pypi.tuna.tsinghua.edu.cn/simple 

7.2 Django配置jinja2

在settings.py文件:

TEMPLATES = [
    {
        # 'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 修改为jinja2模板
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [ os.path.join(BASE_DIR, 'template') ],
        'APP_DIRS': True,
        'OPTIONS': {
            # 默认的
            # 'environment': 'jinja2.Environment',
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

报错的话,使用下面的配置设置:

ERRORS: ?: (admin.E403) A 'django.template.backends.django.DjangoTemplates' instance must be configured in TEMPLATES in order to use the admin application.

来源:08、jinja2模板使用

TEMPLATES = [
    {
        # 'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 修改为jinja2模板
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [ os.path.join(BASE_DIR, 'template') ],
        'APP_DIRS': True,
        'OPTIONS': {
            # 设置jinja2的环境变量
            # 默认设置就为这个,可以不用配置该项
            # 'environment': 'jinja2_env.environment',
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
  {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [ os.path.join(BASE_DIR, 'template') ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

7.3 jinja2模板与Django自带模板的区别

  1. jinja2模板没有多行注释
{% comment %}
  注释内容
{% endcomment %}
  1. jinja2模板中的过滤器使用的就是函数,不为变量|过滤器:参数,如:在Django自带的模板中date过滤器的写法为birthday|date:'Y-m-d H:i:s',在jinja2中直接写函数形式date(birthday)
  2. jinja2中不存在forloop,使用的为loop,jinja2中的loop:

{# 继承父模板 #}
{% extends "base.html" %}
{# 重写页面标题区域 #}
{% block title %}
    张三的个人介绍
{% endblock title %}
{# 重写页面的主体区域 #}
{% block main %}
    <h1>hello world</h1>
    {#  name 为模板等待接收的数据,需要View查询数据库传入模板  #}
    <h1>你好 {{ name }}</h1>
    <p>年龄:{{ age }}</p>
    <p>
        {% if age < 10 %}
            年龄小于10
        {% elif age >= 10 and age < 20 %}
            年龄大于10小于20
        {% else %}
            年龄大于20
        {% endif %}
    </p>
{#    <p>生日:{{ birthday|date:'Y-m-d H:i:s' }}</p>#}
    <p>朋友:</p>
    <ul>
        {#    for 循环    #}
        {% for friend in friends %}
            {#    forloop.counter 获取循环的次序,forloop.count0 获取下标    #}
            <li>{{ loop.index }} {{ loop.index0 }} {{ friend }}</li>
        {% endfor %}
    </ul>
    {#  获取列表中的某个元素,使用点+下标的方式进行获取  #}
    <p>女朋友:{{ friends.2 }}</p>
    {#  获取字典中的某个元素,使用点+key的形式获取  #}
    <p>第一年的薪资:{{ money.first }}</p>
{% endblock %}
{# 不需要底部区域,重写底部区域 #}
{% block footer %}{% endblock %}

7.4 jinja2过滤器

在jinja2_env.py文件中设置jinja2的过滤器.

jinja2_env.py 定义在项目的文件夹目录下

from jinja2 import Environment
# 导入Django中模板的过滤器函数
from django.template.defaultfilters import date
def environment(**options):
    # 创建Environment实例
    env = Environment(**options)
    # 指定jinja2的函数执行django的指定过滤器
    env.globals.update({
        'data': date
    })
    return env

修改配置jinja2的环境配置:

TEMPLATES = [
    # jinja2模板配置
    {
        # 'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 修改为jinja2模板
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [ os.path.join(BASE_DIR, 'template') ],
        'APP_DIRS': True,
        'OPTIONS': {
            # 设置jinja2的环境变量
            # jinja2的默认环境
            # 'environment': 'jinja2.Environment',
            # 我们自己的jinja2环境
            'environment': 'django_pro2.jinja2_env.environment',
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
    # Django自带模板配置
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [ os.path.join(BASE_DIR, 'template') ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

使用jinja2过滤器:

{# 继承父模板 #}
{% extends "base.html" %}
{# 重写页面标题区域 #}
{% block title %}
    张三的个人介绍
{% endblock title %}
{# 重写页面的主体区域 #}
{% block main %}
    <h1>hello world</h1>
    {#  name 为模板等待接收的数据,需要View查询数据库传入模板  #}
    <h1>你好 {{ name }}</h1>
    <p>年龄:{{ age }}</p>
    <p>
        {% if age < 10 %}
            年龄小于10
        {% elif age >= 10 and age < 20 %}
            年龄大于10小于20
        {% else %}
            年龄大于20
        {% endif %}
    </p>
    {#  使用jinja2中的过滤器  #}
    {#  第一个参数为需要进行过滤处理的数据,第二个参数为过滤器需要传递的参数  #}
    <p>生日:{{ date(birthday, 'Y-m-d H:i:s') }}</p>
    <p>朋友:</p>
    <ul>
        {#    for 循环    #}
        {% for friend in friends %}
            {#    forloop.counter 获取循环的次序,forloop.count0 获取下标    #}
            <li>{{ loop.index }} {{ loop.index0 }} {{ friend }}</li>
        {% endfor %}
    </ul>
    {#  获取列表中的某个元素,使用点+下标的方式进行获取  #}
    <p>女朋友:{{ friends.2 }}</p>
    {#  获取字典中的某个元素,使用点+key的形式获取  #}
    <p>第一年的薪资:{{ money.first }}</p>
{% endblock %}
{# 不需要底部区域,重写底部区域 #}
{% block footer %}{% endblock %}

7.5 修改pycharm的模板引擎

7.6 自定义过滤器

在jinja2_env.py文件中自定义过滤器

from jinja2 import Environment
# 导入Django中模板的过滤器函数
from django.template.defaultfilters import date
def environment(**options):
    # 创建Environment实例
    env = Environment(**options)
    # 指定jinja2的函数执行django的指定过滤器
    env.globals.update({
        'date': date,
        # 将自定义的过滤器添加
        'do_listreverse': do_listreverse
    })
    return env
# 1.自定义过滤器
def do_listreverse(li):
    if li == "B":
        return "哈哈"
{# 继承父模板 #}
{% extends "base.html" %}
{# 重写页面标题区域 #}
{% block title %}
    张三的个人介绍
{% endblock title %}
{# 重写页面的主体区域 #}
{% block main %}
    <h1>{{ do_listreverse('B') }}</h1>
{% endblock %}
{# 不需要底部区域,重写底部区域 #}
{% block footer %}{% endblock %}


相关文章
|
1月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
192 0
|
5月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
198 1
|
2月前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
|
3月前
|
JavaScript 前端开发 机器人
【Azure Bot Service】在中国区Azure上部署机器人的 Python 版配置
本文介绍了在中国区Azure上使用Python SDK配置Azure Bot Service时遇到的问题及解决方案,涵盖参数设置与适配器配置,适用于希望在Azure中国区部署Python机器人的开发者。
112 6
|
4月前
|
存储 前端开发 应用服务中间件
Django 实战:静态文件与媒体文件从开发配置到生产部署
Django项目中,静态文件(Static Files)和媒体文件(Media Files)是两类不同用途的文件。本文详细介绍了它们的区别、配置方法以及在开发与生产环境中的处理方式,并结合用户头像上传功能进行实战演示,最后讲解了如何通过Nginx或OpenResty部署静态与媒体文件服务。
235 1
|
5月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
196 1
|
6月前
|
SQL 安全 算法
解读 Python 3.14:模板字符串、惰性类型、Zstd压缩等7大核心功能升级
Python 3.14 引入了七大核心技术特性,大幅提升开发效率与应用安全性。其中包括:t-strings(PEP 750)提供更安全灵活的字符串处理;类型注解惰性求值(PEP 649)优化启动性能;外部调试器API标准化(PEP 768)增强调试体验;原生支持Zstandard压缩算法(PEP 784)提高效率;REPL交互环境升级更友好;UUID模块扩展支持新标准并优化性能;finally块语义强化(PEP 765)确保资源清理可靠性。这些改进使Python在后端开发、数据科学等领域更具竞争力。
268 5
解读 Python 3.14:模板字符串、惰性类型、Zstd压缩等7大核心功能升级
|
6月前
|
Python
在VScode环境下配置Python环境的方法
经过上述步骤,你的VSCode环境就已经配置好了。请尽情享受这扇你为自己开启的知识之窗。如同你在冒险世界中前行,你的探索之路只有越走越广,你获得的知识只会越来越丰富,你的能力只会越来越强。
634 37
|
7月前
|
IDE 开发工具 开发者
手把手教你安装PyCharm 2025:开发者的Python IDE配置全流程+避坑指南
本教程详细介绍了PyCharm 2025版本在Windows系统下的安装流程及配置方法,涵盖AI代码补全与智能调试工具链等新功能。内容包括系统要求、安装步骤、首次运行配置(如主题选择与插件安装)、创建首个Python项目,以及常见问题解决方法。此外,还提供了切换中文界面和延伸学习资源的指导,帮助用户快速上手并高效使用PyCharm进行开发。
3589 61

推荐镜像

更多