flaskweb开发Jinja2 模板过滤器|“朝闻道”知识分享大赛

简单凯凯 2024-11-30 17:26:08

这是我参加朝闻道知识分享大赛的第11篇文章

Jinja2 模板过滤器笔记

常用过滤器

default 过滤器

  • 使用方式{{ value|default('默认值') }}

    • 如果 value 不存在,则使用 default 过滤器提供的默认值。

    • 如果要判断 value 是否为 False(如 None、空字符串、空列表、空字典等),需传递 boolean=True 参数:{{ value|default('默认值', boolean=True) }}

    • 可以用 or 替代 default('默认值', boolean=True),例如:{{ signature or '此人很懒,没有留下任何说明' }}

自动转义过滤器

  1. safe 过滤器: 关闭字符串的自动转义。

  2. escape 过滤器: 对字符串进行转义。

  3. autoescape 标签: 控制代码块的自动转义开关。

    jinja

    复制

    {% autoescape off/on %}
        ...代码块
    {% endautoescape %}

常用过滤器

  1. first(value): 返回序列的第一个元素。

    • 示例: names|first

  2. format(value, *args, **kwargs): 格式化字符串。

    • 示例: {{ "%s - %s"|format('Hello?', "Foo!") }}

    • 输出: Hello? - Foo!

  3. last(value): 返回序列的最后一个元素。

    • 示例: names|last

  4. length(value): 返回序列或字典的长度。

    • 示例: names|length

  5. join(value, d=u''): 用 d 参数的值拼接序列成字符串。

    • 示例: names|join(', ')

  6. safe(value): 如果开启了全局转义,safe 过滤器会关闭变量的转义。

    • 示例: content_html|safe

  7. int(value): 将值转换为 int 类型。

    • 示例: price|int

  8. float(value): 将值转换为 float 类型。

    • 示例: price|float

  9. lower(value): 将字符串转换为小写。

    • 示例: name|lower

  10. upper(value): 将字符串转换为大写。

    • 示例: name|upper

  11. replace(value, old, new): 将字符串中的 old 替换为 new

    • 示例: text|replace('old', 'new')

  12. truncate(value, length=255, killwords=False): 截取指定长度的字符串。

    • 示例: text|truncate(50)

  13. striptags(value): 删除字符串中的所有 HTML 标签,多个空格替换为一个空格。

    • 示例: html_content|striptags

  14. trim: 截取字符串前后的空白字符。

    • 示例: text|trim

  15. string(value): 将变量转换为字符串。

    • 示例: number|string

  16. wordcount(s): 计算长字符串中的单词个数。

    • 示例: text|wordcount

自定义模板过滤器

基本概念

  • 过滤器本质上是一个函数。

  • 模板中调用过滤器时,变量的值会作为第一个参数传给过滤器函数,函数的返回值作为过滤器的返回值。

示例:自定义 cut 过滤器

@app.template_filter('cut')
def cut(value):
    value = value.replace("hello", '')
    return value

示例:自定义时间过滤器

@app.template_filter('li_time')
def li_time(time):
    if isinstance(time, datetime):
        now = datetime.now()
        li = (now - time).total_seconds()
        if li < 60:
            return "刚刚"
        elif li >= 60 and li < 60 * 60:
            return f"{int(li / 60)}分钟前"
        elif li >= 60 * 60 and li < 60 * 60 * 24:
            return f"{int(li / (60 * 60))}小时前"
        else:
            return time.strftime("%Y-%m-%d")
    else:
        return time

总结

Jinja2 提供了丰富的内置过滤器,同时也支持自定义过滤器,使得模板渲染更加灵活和强大。通过合理使用过滤器,可以大大简化模板中的逻辑处理,提高代码的可读性和可维护性

...全文
7 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

997

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧