前段时间我尝试了几种不同的方法,每种方法都给出了不同的异常,所以我放弃了,决定在需要时手动编写过滤器。但我缺少原生的 escapejs 和其他有用但简单的过滤器。
有几个相关的问题和答案,但据我所知,它们都没有提供无缝的方式来实现这一点。我想主要的问题是 django 过滤器例程与 django 环境绑定太多。
请仅在您设法在 Appengine SDK 环境中使用内置 django 过滤器时回答,根据我的经验,与普通环境相比,它更难,因为 Appengine 环境是有限的
前段时间我尝试了几种不同的方法,每种方法都给出了不同的异常,所以我放弃了,决定在需要时手动编写过滤器。但我缺少原生的 escapejs 和其他有用但简单的过滤器。
有几个相关的问题和答案,但据我所知,它们都没有提供无缝的方式来实现这一点。我想主要的问题是 django 过滤器例程与 django 环境绑定太多。
请仅在您设法在 Appengine SDK 环境中使用内置 django 过滤器时回答,根据我的经验,与普通环境相比,它更难,因为 Appengine 环境是有限的
我在评论中提到了这一点,但我会在这里更具体,因为我有更多空间。Django 是一个端到端的 Web 应用程序框架,它恰好包含自己的模板语言,由于没有更好的术语,它被称为“Django 模板语言”。文档中的所有模板标签和过滤器都特定于该语言。
如果您选择使用 Jinja2,则选择使用该模板语言的结构来排除 Django 的结构。(显然模型和视图是一个单独的层,但原则上,它们也可以交换——它们都是松散耦合的。)所以在这种情况下,用于模板的 Django 文档对你没有好处。format
根据Jinja docs,如果您想在 Jinja2 中格式化浮点数,看起来您需要使用过滤器。
如果没有更多信息,我真的不能说是什么导致了您的 ImportError,但floatformat
不会在 Jinja2 模板中工作,所以也许这与它有关。
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.defaulttags
和中django.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