2011-11-25 38 views
4

我用棺材的Jinja2集成了的Django應用將物體放入模板通過的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對象作爲第二個參數傳遞給nodes.Assign()。我應該怎麼做?

回答

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

有自定義標籤和過濾器沒有必要的。

+0

謝謝,這完美的作品!我想你只是在你的templatetag文件中缺少一個「from sorl.thumbnail.shortcuts import get_thumbnail」。 – mrooney

+0

@mrooney謝謝。我已經更新了我的答案 –

2

下面是使用類似的東西,適用於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)