如何使用 Coffin 在 Django 应用程序中通过 Jinja2 将对象放入模板中
我使用 Coffin 将 Jinja2 与 Django 应用程序集成。我想在我的 Jinja2 模板中使用 sorl 应用程序。所以我决定为标签 {%thumbnail%} 编写自己的扩展。我决定使用一个很棒的 WithExtension 作为示例,它是从带有棺材的盒子中取出的。
我的扩展:
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 对象作为第二个参数传递给节点。分配( )。我应该怎么做?
I use Coffin to integrate Jinja2 with Django application. I want to use sorl application in my Jinja2 template. So i decided to write my own Extension for tag {% thumbnail %}. I decided to use a great WithExtension as an example which come out from a box with Coffin.
My extension:
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()
My template:
{% thumbnail "jinja.png" as img %}
{{ img.url }}
{% endthumbnail %}
But i get an AttributeError: 'ImageFile' object has no attribute 'iter_child_nodes'
It`s seems that i should pass a jinja2.nodes.Node object as a second parameter to nodes.Assign( ). How should i do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
通过将 get_thumbnail 函数发送到模板中解决了问题:
现在我可以直接从模板调用它:
自定义标签或过滤器中没有必要。
Problem solved by sending a get_thumbnail function into template:
And now I can call it directly from template:
There is no necessary in custom tag or filter.
这是类似的东西,适合在 2016 年使用,使用 coffin 的后继者 django-jinja --
Here's something similar, suitable for use in 2016, using coffin's successor, django-jinja --