【从零开始学Django篇002】过滤器与simple_tag与inclusion_tag

🍁前言

👑作者主页:👉CSDN** 丨**博客园****

🏆学习交流:👉在下周周ovoの社区****

💎从零开始学Django系列专栏:👉Django系列专栏

过滤器(filter)

simple_tag

当我们在Django中使用模板时,有时候需要定义一些简单的、无需传递上下文变量的模板标签,例如生成一段静态的HTML代码或执行一些简单的操作。为了实现这样的功能,Django提供了simple_tag模板标签。

simple_tag用于创建一个简单的模板标签,它可以执行一些逻辑操作,并返回生成的HTML代码或其他内容。与inclusion_tag不同,simple_tag不需要传递上下文变量,它主要用于处理静态内容或执行一些简单的操作。

语法:

python 复制代码
from django import template

register = template.Library()

@register.simple_tag(name='tag_name')
def tag_name(*args, **kwargs):
    # 处理逻辑
    return result
  • 可以通过name参数指定模板标签的名称。
  • 使用@register.simple_tag装饰器将函数注册为一个simple tag。
  • tag_name是在模板中调用该标签时使用的标签名称。
  • *args**kwargs是传递给标签的参数,可以根据需要自定义参数列表。
  • 函数体内部可以处理一些逻辑操作,然后返回一个结果。

例子:

demo_app / templatetags / my_simple.py

python 复制代码
# 导入Django的template模块,提供了创建自定义模板标签和过滤器的工具。
from django import template

# 创建名为'register'的template.Library()对象,用于注册自定义的标签和过滤器。
register = template.Library()


@register.simple_tag(name='add')
def add_any(*args):
    args = map(str, args)  # 将args中的元素转换为字符串类型
    return '+'.join(args)

test.html

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>test.html</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/normalize/8.0.1/normalize.css" rel="stylesheet">
    <style>
        h1 {
            color: #2A325E;
            margin-bottom: 20px;
        }

        h4 {
            color: #9C7F7F;
            margin-bottom: 10px;
        }

        h3 {
            font-size: 16px;
            color: red;
            margin-bottom: 5px;
        }

        /* 下面的代码主要是设置背景是固定的不会随着页面的滚动而滚动 */
        .background {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100vh;
            background: linear-gradient(to right bottom, #F6E9F9, #FFC6FF, #BCB4CC);
            z-index: -1;
        }
    </style>
</head>
<body>
<!-- -->
<div class="background"></div>

<!-- simple_tag的例子 -->
{% load my_simple %}
{% add 1 "CSDN" "博客园" %}
</body>
</html>

inclusion_tag

当我们在Django中使用模板时,有时候需要在多个页面中重复使用一些相同的代码块,例如导航栏、页脚或侧边栏。为了避免在每个页面中都重复编写相同的代码,Django提供了inclusion_tag模板标签。

inclusion_tag用于创建一个可在多个模板中重复使用的代码块,这个代码块通常被称为"片段"或"组件"。通过使用inclusion_tag,我们可以将代码块封装为一个函数,并在需要的地方通过调用函数来使用它。这样,我们只需编写一次代码,然后在任意模板中使用它。

语法如下:

python 复制代码
@register.inclusion_tag('template_name.html')
def tag_name(*args, **kwargs):
    # 处理逻辑
    return {'context_variable': value}
  • 使用@register.inclusion_tag装饰器将函数注册为一个inclusion tag。
  • 'template_name.html'是要渲染的模板片段的路径。
  • tag_name是在模板中调用该标签时使用的标签名称。
  • *args**kwargs是传递给标签的参数,可以根据需要自定义参数列表。
  • 函数体内部可以处理一些逻辑,最后返回一个包含渲染上下文的字典。

例子:

demo_app / templatetags / my_inclusion.py

python 复制代码
# 导入Django的template模块,提供了创建自定义模板标签和过滤器的工具。
from django import template

# 创建名为'register'的template.Library()对象,用于注册自定义的标签和过滤器。
register = template.Library()


# 使用@register.inclusion_tag装饰器,将函数注册为inclusion tag。
@register.inclusion_tag('inclusion.html')
def show(t, n):
    # 对n进行处理,如果n小于1,则将其设置为1;否则将其转换为整数类型。
    n = 1 if n < 1 else int(n)

    # 创建一个名为time的列表,包含从1到n的努力次数的字符串。
    # 使用列表推导式生成字符串列表。
    time = ["第{}次努力".format(i) for i in range(1, n+1)]

    # 返回一个字典,包含t和time作为键,对应的值将在模板中使用。
    return {"t": t, "time": time}

inclusion.html

python 复制代码
<h1>{{ t }}</h1>
<ul>
    {% for num in time %}
        <li>{{ num }}</li>
    {% endfor %}
</ul>

test.html

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>test.html</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/normalize/8.0.1/normalize.css" rel="stylesheet">
    <style>
         h1 {
            color: #2A325E;
            margin-bottom: 20px;
        }
        h4 {
            color: #9C7F7F;
            margin-bottom: 10px;
        }
        h3 {
            font-size: 16px;
            color: red;
            margin-bottom: 5px;
        }
        /* 下面的代码主要是设置背景是固定的不会随着页面的滚动而滚动 */
        .background {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100vh;
            background: linear-gradient(to right bottom, #F6E9F9, #FFC6FF, #BCB4CC);
            z-index: -1;
        }
    </style>
</head>
<body>
<!-- -->
    <div class="background"></div>
    <!-- inclusion_tag的例子 先导入对应的.py文件 -->
    {% load my_inclusion %}
    {% show "inclusion_tag的例子" 99 %}
</body>
</html>
相关推荐
Mopes__1 小时前
Python | Leetcode Python题解之第517题超级洗衣机
python·leetcode·题解
喵手1 小时前
Java 与 Oracle 数据泵实操:数据导入导出的全方位指南
java·开发语言·oracle
硬汉嵌入式2 小时前
H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)
开发语言·junit·小程序·lua
Wx120不知道取啥名2 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
Python私教3 小时前
Flutter颜色和主题
开发语言·javascript·flutter
代码吐槽菌3 小时前
基于SSM的汽车客运站管理系统【附源码】
java·开发语言·数据库·spring boot·后端·汽车
测试老哥3 小时前
Python+Selenium+Pytest+POM自动化测试框架封装(完整版)
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
Ws_3 小时前
蓝桥杯 python day01 第一题
开发语言·python·蓝桥杯
zdkdchao3 小时前
jdk,openjdk,oraclejdk
java·开发语言
神雕大侠mu4 小时前
函数式接口与回调函数实践
开发语言·python