【问题标题】:How to create Jinja2 custom filters with django_jinja app?如何使用 django_jinja 应用程序创建 Jinja2 自定义过滤器?
【发布时间】:2014-03-14 10:11:10
【问题描述】:

我不知道如何访问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

【问题讨论】:

    标签: python django jinja2 customization


    【解决方案1】:

    我用过这个……

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

    希望这会有所帮助!

    【讨论】:

    【解决方案2】:

    我意识到这个问题已经相当老了,但是在四处寻找解决这个问题并且没有找到任何有用的答案,我想分享我在django_jinja 文档here 中的发现。

    有两个用例:

    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",
                  ...
              }
          }
      }]
      

      更多细节,包括指定自定义扩展、上下文处理器等,可以从this page获得。

    2. 在创建可重用的 Django 应用时注册应用特定的过滤器。在这里,django_jinja 再次提供了帮助,让您可以将过滤器注册到全局过滤器库,如下所示,

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

      更多详情here

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

    【讨论】:

    • 有没有一种方法可以创建整个站点都可用的整个过滤器库,而无需在 OPTIONS:filters 中列出每个过滤器?似乎这对于他们给出的示例(小写等)特别有用。
    • 啊哈! sergzach 在下面回答了它!
    • 这些似乎都不起作用。选项 1 给出 __init__() got an unexpected keyword argument 'filters' 而选项 2 给出 ("no filter named 'mylower'",)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 2014-09-26
        • 2016-07-31
        • 1970-01-01
        • 2019-04-04
        相关资源
        最近更新 更多