我使用 Coffin 将 Jinja2 与 Django 应用程序集成。我想在Jinja2模板中使用 sorl 应用程序。所以我决定为标签{%thumbnail%}编写自己的扩展程序。我决定使用一个很棒的 WithExtension 作为一个例子,它来自Coffin的一个盒子。
我的扩展名:
class ThumbnailExtension(Extension):
tags = set(['thumbnail'])
def parse(self, parser):
lineno = parser.stream.next().lineno
value = parser.parse_expression()
im = get_thumbnail(value.value, "100x100")
parser.stream.expect('name:as')
name = parser.stream.expect('name')
body = parser.parse_statements(['name:endthumbnail'], drop_needle=True)
# Use a local variable instead of a macro argument to alias
# the expression. This allows us to nest "with" statements.
body.insert(0, nodes.Assign(nodes.Name(name.value, 'store'), im))
return nodes.CallBlock(
self.call_method('_render_block'), [], [], body).\
set_lineno(lineno)
def _render_block(self, caller=None):
return caller()
我的模板:
{% thumbnail "jinja.png" as img %}
{{ img.url }}
{% endthumbnail %}
但我得到AttributeError: 'ImageFile' object has no attribute 'iter_child_nodes'
似乎我应该将jinja2.nodes.Node对象作为第二个参数传递给nodes.Assign()。我该怎么做?
答案 0 :(得分:4)
通过将get_thumbnail函数发送到模板中解决了问题:
from sorl.thumbnail.shortcuts import get_thumbnail
from coffin.template import Library
register = Library()
@register.object()
def thumbnail(file_, geometry_string, **options):
try:
im = get_thumbnail(file_, geometry_string, **options)
except IOError:
im = None
return im
现在我可以直接从模板中调用它:
{% set image = thumbnail(image_object, params.size|default("100x100")) %}
自定义标记或过滤器没有必要。
答案 1 :(得分:3)
这是类似的,适合在2016年使用,使用棺材的继任者,django-jinja -
from sorl.thumbnail.shortcuts import get_thumbnail
from django_jinja import library
@library.filter
def thumbnail(path, geometry, **options):
return get_thumbnail(path, geometry, **options)