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

时间:2014-03-14 10:11:10

标签: python django jinja2 customization

我无法弄清楚如何访问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的宏,内置函数 OK )。所以我的观点做出了这样的回应:

return render_to_response( html_template, result_dict )

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

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

以下是该应用的说明:https://pypi.python.org/pypi/django-jinja/0.8

4 个答案:

答案 0 :(得分:5)

我用过这个......

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

希望这有帮助!

答案 1 :(得分:3)

我意识到这个问题相当陈旧但是我一直在寻找解决这个问题的方法,并且没有在SO上找到任何有用的答案,我想从django_jinja文档中分享我的发现{ {3}}

有两种用例:

  1. 在Django项目settings.py中全局注册过滤器。这可以在jinja2被指定为TEMPLATES设置中的模板引擎时完成,例如

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

    可以从here获取更多指定自定义扩展,上下文处理器等的详细信息。

  2. 在创建可重复使用的Django应用时注册特定于应用的过滤器。在这里,django_jinja再次通过让您将过滤器注册到全局过滤器库来实现救援,如下所示,

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

    更多详情this page

  3. 上述两个示例都已从django_jinja文档中取消。使用2当然意味着django_jinja是您的可重用应用程序的依赖项,但如果像我一样,您几乎可以在所有Django应用程序中使用Jinja模板,这不是什么大不了的事。

答案 2 :(得分: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检索所有未以_开头的函数。

答案 3 :(得分:0)

您可以使用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)