Handlebars.js in Django templates

前端 未结 8 1566

I need a javascript templating system and i think handlebars.js does an excellent job in this case. I\'m having syntax conflicts with handlebars templates inside a django te

相关标签:
8条回答
  • 2020-12-24 06:56

    Django's templating system doesn't support escaping blocks at a time. It would be easy to work around were it not for the fact that when templates are processed the tokenizer doesn't keep exact information on what the tokens looked like before they got tokenized.

    I have used the following work-around which is ugly, but (sort of) works. Use different tag delimiters in your templates and a django template tag that translates those back to what you actually want:

    @register.tag(name="jstemplate")
    def do_jstemplate(parser, token):
        while self.tokens:
            token = self.next_token()
            if token.token_type == TOKEN_BLOCK and token.contents == endtag:
                return
        self.unclosed_block_tag([endtag])
        nodelist = parser.parse( ('endjstemplate',) )
        parser.delete_first_token()
        s = token.split_contents()
        tmpl_id = Variable( s[1] ) if (len(s) == 2 and s[1]) else ''
        return JsTemplateNode( nodelist, tmpl_id )
    
    class JsTemplateNode(template.Node):
        def __init__(self, nodelist, tmpl_id=''):
            self.tmpl_id = tmpl_id
            self.nodelist = nodelist
        def render(self, context):
            content = self.nodelist.render(context)
            return u'<script id="%s" type="text/x-handlebars-template">%s</script>' % (
                    self.tmpl_id.resolve(context),
                    re.sub( ur'{\$(.*?)\$}', u'{{\\1}}', content ), )
    

    For bonus points you can leverage Django's templates within your templates ... which will probably cook your brain trying to untangle later:

    {% jstemplate "restaurants-tpl" %}
    {$#restaurants$}
    <div id="<$name$<" class="{$type$}">
        <ul class="info">
            {$#if info/price_range$}<li><em>{{ trans "Price Range" }}:</em> {$info/price_range$}</li>{$/if$}
            {$#if info/awards$}<li><em>{{ trans "Awards" }}:</em> {$info/awards$}{$/if$}
        </ul>
        <div class="options">
            <button>{% trans "Reservation" %}</button>
        </div>
    </div>
    {$/restaurants$}
    {% jstemplate %}
    
    0 讨论(0)
  • 2020-12-24 07:03

    Actually I wrote a custom template filter which goes like this:

    from django import template
    register = template.Library()
    def handlebars(value):
        return '{{%s}}' % value
    register.filter('handlebars', handlebars)
    

    and use it in a template like so:

    {{"this.is.a.handlebars.variable"|handlebars}}
    

    It's the simplest thing I could think of. You just have to put your handlebars variable name in quotes. I regret I hadn't got this idea before I struggled with ssi. It works also with keywords:

    {{"#each items"|handlebars}}
    
    0 讨论(0)
提交回复
热议问题