【从零开始学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>
相关推荐
2601_9620664926 分钟前
【玩转全栈】----Django模板的继承
数据库·django·sqlite
千里码aicood29 分钟前
Django+Vue 基于XGBoost与随机森林的沿海地区台风天气大数据预警系统实现
vue.js·随机森林·django
烂蜻蜓1 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
jay神1 小时前
【计算机毕业设计】基于Flask+Vue的电影数据可视化与智能推荐系统
前端·vue.js·python·信息可视化·flask·毕业设计·课程设计
满怀冰雪2 小时前
24-PaddleClas 模型评估、导出与推理部署入门
大数据·人工智能·python·深度学习·paddle
Chester_19997 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
DeepVisionary8 小时前
谷歌 Gemini Omni 1.1 Flash 正式发布:4K 视频、40 秒场景延伸,视频生成进入按 token 计费时代
python·自动化
阡之尘埃8 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问
海兰8 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融
EXI-小洲8 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word