如何使用django_jinja创建Jinja2自定义过滤器?

4 投票
4 回答
6707 浏览
提问于 2025-04-17 22:17

我不知道怎么访问 environment.filters。在标准的 Jinja2 示例中,我看到有一个 datetimeformat 过滤器的例子:

def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
    return value.strftime(format)

然后我们可以添加这个过滤器:

environment.filters['datetimeformat'] = datetimeformat

但是我使用了 django_jinja 应用,现在用的是 Django 自带的 render_to_response 方法(Jinja 的宏和内置函数都能正常工作)。所以我的视图返回的是这样的响应:

return render_to_response( html_template, result_dict )

我只包含了 Jinja2 应用,也不担心构建自定义的 Jinja2 响应,但我不知道怎么访问环境。

我应该怎么改才能在 django_jinja 应用中添加一个自定义模板过滤器呢?

这里是这个应用的描述: https://pypi.python.org/pypi/django-jinja/0.8

4 个回答

1

你可以使用 django-jinja 来轻松实现这个功能:

<someapp>/templatetags/<anyfile>.py 文件中,你只需要这样做:

from django_jinja import library

@library.filter
def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
    return value.strftime(format)
1

我们还手动收集过滤器,如果我们希望它们都放在一个文件里。更新 JINJA2_FILTERS 字典(通常放在 settings.py 文件里):

# settingsutils.py
import filters # our file of filters
import inspect

def collect_j2_filters( JINJA2_FILTERS ):
""" Collects JINJA2 filters
"""

exclude_prefix = '_'

funcs = inspect.getmembers( filters, inspect.isfunction )

for f in funcs:
    name = f[ 0 ]
    callable = f[ 1 ]

    if name.find( exclude_prefix ) != 0: # filter function is found
        JINJA2_FILTERS.update( { name[ len_prefix: ]: callable } )  


# settings.py
from settingsutils import collect_j2_filters

JINJA2_FILTERS = {}
collect_j2_filters( JINJA2_FILTERS )

之后,我们可以把所有的过滤器函数放到主项目目录下的 filters.py 文件里。collect_js_filters 会获取所有没有以 _ 开头的函数。

5

我知道这个问题已经有点旧了,但我在网上找解决办法的时候没有找到什么有用的答案,所以想分享一下我从 django_jinja 的文档中了解到的内容,详细信息可以在这里找到。

这里有两种使用场景:

  1. 在你的Django项目的 settings.py 文件中全局注册过滤器。这可以在 TEMPLATES 设置中指定使用 jinja2 作为模板引擎时完成,比如:

    TEMPLATES = [
    {
        "BACKEND": "django_jinja.backend.Jinja2",
        "APP_DIRS": True,
        "OPTIONS": {
            "match_extension": ".jinja",
            "filters": {
                "myfilter": "path.to.filters.myfilterfn",
                ...
            }
        }
    }]
    

    更多细节,包括如何指定自定义扩展、上下文处理器等,可以在这一页找到。

  2. 在创建可重用的Django应用时注册特定于应用的过滤器。在这里,django_jinja 也能帮上忙,让你可以将过滤器注册到全局过滤器库,方法如下:

    from django_jinja import library
    @library.filter
    def mylower(name):
    """
    Usage: {{ 'Hello'|mylower() }}
    """
    return name.lower()
    

    更多细节可以在这里找到。

以上两个例子都是直接引用自 django_jinja 的文档。使用第二种方法当然意味着 django_jinja 是你可重用应用的一个依赖,但如果你像我一样,几乎所有的Django应用都使用Jinja模板,这其实也没什么大不了的。

7

我用了这个...

jinja2.filters.FILTERS['datetimeformat'] = datetimeformat

希望这对你有帮助!

撰写回答