当前位置: 代码迷 >> python >> 如何用django_jinja app创建Jinja2自定义过滤器?
  详细解决方案

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

热度:99   发布时间:2023-07-14 09:48:38.0

我无法弄清楚如何访问environment.filters 在标准的Jinja2示例中,我可以看到datetimeformat过滤器的示例:

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

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

environment.filters['datetimeformat'] = datetimeformat

但我附加了django_jinja应用程序,现在使用django.shortcuts的一个标准的render_to_response方法(Jinja的宏,内置函数工作正常 )。 所以我的观点得到了这样的回应

return render_to_response( html_template, result_dict )

我只包括Jinja2应用程序,不用担心构建自定义Jinja2响应,但我不知道如何访问环境。

使用django_jinja应用程序添加自定义模板过滤器应该更改什么?

以下是该应用程序的说明: : 。

我用过这个......

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

希望这可以帮助!

我意识到这个问题相当陈旧,但是我一直在寻找解决这个问题的方法,并且没有找到任何有用的答案,我想分享我的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文档中解除的。 使用2当然意味着django_jinja是你的可重用应用程序的依赖项,但如果像我一样,你几乎所有的Django应用程序都使用Jinja模板,这不是什么大不了的事。

如果我们希望它们存在于一个文件中,我们也会手动收集过滤器。 更新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检索所有不以_开头的函数。

您可以使用轻松完成此操作:

<someapp>/templatetags/<anyfile>.py您只需执行此操作

from django_jinja import library

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