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


相关文章
|
13天前
|
设计模式 JSON 前端开发
前后端配置动态的数据字段标签(django_vue)
前后端配置动态的数据字段标签(django_vue)
18 0
|
4天前
|
存储 Python
Python进阶语法之推导式
本章是对自己学完基础语法后,学习python进阶语法推导式过程中,自己的一些理解和看法,因为自己从刚开始第一次看看不懂,到学习一段时间后,通过积累再次看这里的知识点发现自己有了新的理解,这次将这部分知识学完了,剩下就是通过练习来达到熟练了.本章的推导式,包含列表推导式,字典推导式,集合与元组推导式这四种.主要是对python进阶语法推导式,的练习与理解,同时也提高了自己对代码的简化和运行的能力的提高,也是在这次学习中,我发现学习代码更多需要的是对基础和知识的积累,当眼界与思维突破瓶颈,看之前难以理解的事物发现变的容易去使用和理解了.
|
4天前
|
Java 开发者 索引
Python基础语法:类笔记
本篇博文是把自己在学习python类的过程中自己理解和笔记,一点一点总结的写出出来,做一个总结,加深对面向对象编程的理解。
|
8天前
|
Python
python中的语法错误
【4月更文挑战第23天】
16 3
|
8天前
|
Python
python web框架fastapi模板渲染--Jinja2使用技巧总结
python web框架fastapi模板渲染--Jinja2使用技巧总结
|
9天前
|
缓存 JavaScript 安全
Django的模板渲染(二)
Django的模板渲染(二)
|
9天前
|
前端开发 JavaScript 开发者
Django的模板渲染(一)
Django的模板渲染(一)
|
10天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之阿里函数计算中在自定义环境下用debian10运行django,用官方层的python3.9,配置好环境变量后发现自定义层的django找不到了如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
19 3
|
10天前
|
计算机视觉 Python
【python版CV】图像轮廓&模板匹配
【python版CV】图像轮廓&模板匹配
|
12天前
|
存储 搜索推荐 开发者
django-haystack,具有全文搜索功能的 Python 库!
django-haystack,具有全文搜索功能的 Python 库!
23 0