如何使用Appengine SDK在Jinja2中使用Django内置过滤器?

时间:2013-01-17 19:11:00

标签: python django google-app-engine jinja2

前段时间我尝试了几种不同的方法,每种方法都有不同的例外,所以我放弃了,并决定在需要时手动编写过滤器。但我错过了原生的escapejs和其他有用但简单的过滤器。

有几个相关的问题和答案,但据我所知,它们都没有提供实现这一点的无缝方式。我想主要问题是django过滤器例程与django环境绑定太多。

请仅在您在Appengine SDK环境中设法使用内置django过滤器时回答,根据我的经验,与普通环境相比更难,因为Appengine环境有限

2 个答案:

答案 0 :(得分:1)

我在评论中提到了这一点,但由于我有更多的空间,因此我会更具体。 Django是一个端到端的Web应用程序框架,它恰好包含了自己的模板语言,缺少更好的术语只称为“Django模板语言”。文档中的所有模板标记和过滤器都特定于该语言。

如果您选择使用Jinja2,则选择使用 模板语言的结构来排除Django。 (显然模型和视图的东西是一个单独的层,但原则上,那些也可以交换 - 它们都是松耦合的。)因此,在这种情况下,用于模板的Django文档对你没有好处。如果要在Jinja2中格式化浮点数,根据Jinja docs,您似乎需要使用format过滤器。

如果没有更多信息,我真的不能说是导致你的ImportError的原因,但是floatformat不会在Jinja2模板中起作用,所以也许这与它有关。

答案 1 :(得分:1)

Django模板引擎中的模板标签是接受值和参数的简单函数。它们都可以直接在源代码中访问。

这是IPython的输出:

In [173]: from django.template.defaultfilters import  date 

In [174]: date??
Type:       function
String Form:<function date at 0xa2935f0>
File:       /usr/local/python/thor/lib/python2.7/site-packages/django/template/defaultfilters.py
Definition: date(value, arg=None)
Source:
@register.filter(expects_localtime=True, is_safe=False)
def date(value, arg=None):
    """Formats a date according to the given format."""
    if not value:
        return u''
    if arg is None:
        arg = settings.DATE_FORMAT
    try:
        return formats.date_format(value, arg)
    except AttributeError:
        try:
            return format(value, arg)
        except AttributeError:
            return ''

大多数特定于Django的魔法都驻留在装饰器(register.filter)中,以及当您在模板中键入{% load <template library> %}时语言解析调用的方式。在<module>.templatetags模块中查找定义。内置插件位于django.template.defaulttagsdjango.template.defaultfilters

如果Jinja2有一种方法来定义新的模板过滤器(它可能会这样做),那么你可以简单地将手工模板过滤器包装到实际的Django函数中。

基本上,只需创建指向实际Django函数定义的Jinja2过滤器。

编辑: 如果您无法访问实际的Django函数,只需复制粘贴源代码并删除或修改Django特定的东西。

escapejs过滤器实际上是django.utils.html中对此功能的调用:

_base_js_escapes = (
    ('\\', r'\u005C'),
    ('\'', r'\u0027'),
    ('"', r'\u0022'),
    ('>', r'\u003E'),
    ('<', r'\u003C'),
    ('&', r'\u0026'),
    ('=', r'\u003D'),
    ('-', r'\u002D'),
    (';', r'\u003B'),
    (u'\u2028', r'\u2028'),
    (u'\u2029', r'\u2029')
)

# Escape every ASCII character with a value less than 32.
_js_escapes = (_base_js_escapes +
               tuple([('%c' % z, '\\u%04X' % z) for z in range(32)]))

def escapejs(value):
    """Hex encodes characters for use in JavaScript strings."""
    for bad, good in _js_escapes:
        value = mark_safe(force_unicode(value).replace(bad, good))
    return value