一段时间之前,我尝试了几种不同的方法,每种方法都给出了不同的异常,因此我放弃了并决定在需要时手动编写过滤器。但是我缺少本机的scapesjs和其他有用但简单的过滤器。
有几个相关的问题和答案,但据我所知,没有一个提供无缝的实现方法。我猜主要的问题是django过滤器例程与django环境有太多联系。
仅在您成功在Appengine SDK环境中使用内置django过滤器的情况下,请回答,根据我的经验,由于Appengine环境有限,因此与普通环境相比,难度要大一些
最佳答案
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
关于python - 如何通过Appengine SDK将Django内置过滤器与Jinja2一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14386349/