如何使用 Coffin 在 Django 应用程序中通过 Jinja2 将对象放入模板中

发布于 2024-12-18 07:18:04 字数 1303 浏览 2 评论 0原文

我使用 CoffinJinja2Django 应用程序集成。我想在我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

静赏你的温柔 2024-12-25 07:18:04

通过将 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")) %}

自定义标签或过滤器中没有必要。

Problem solved by sending a get_thumbnail function into template:

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

And now I can call it directly from template:

{% set image = thumbnail(image_object, params.size|default("100x100")) %}

There is no necessary in custom tag or filter.

Spring初心 2024-12-25 07:18:04

这是类似的东西,适合在 2016 年使用,使用 coffin 的后继者 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)

Here's something similar, suitable for use in 2016, using coffin's successor, 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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文