Как поместить объект в шаблон через Jinja2 в приложении Django с помощью Coffin - PullRequest
4 голосов
/ 25 ноября 2011

Я использую Гроб для интеграции Jinja2 с Django приложением.Я хочу использовать приложение sorl в моем шаблоне Jinja2.Поэтому я решил написать собственное расширение для тега {% 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 в качестве второго параметра для node.Assign ().Как мне это сделать?

Ответы [ 2 ]

4 голосов
/ 29 ноября 2011

Проблема решена отправкой функции 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")) %}

Нет необходимости в пользовательских тегах или фильтрах.

3 голосов
/ 24 марта 2016

Вот что-то похожее, подходящее для использования в 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)
...