Chris Spencer
Chris Spencer

Reputation: 57

Including Blocks from Jinja templates

I would like to include blocks from templates instead of macros, as many templates will be including content from many other templates, so extends isn't an option.

I've read many answers about this, including blocks in included files, but the use case always seems to be different. I suspect this cannot be done.

template1.html

{% block description %}
   <p> Here is a description </p>
{% endblock %}

And in template2.html

{% from 'template1.html' import description %} <- doesnt work

Upvotes: 2

Views: 1419

Answers (1)

Aaron Meier
Aaron Meier

Reputation: 950

You have two options here.

  1. Use a macro, which sounds like something you don't want to do.
  2. Use a template_filter.

Assuming you're using Flask, this is as easy as:

@app.template_filter('get_block')
def template_filter(block, file):
    html = render_template(file)
    # Then use regex or something to parse
    # or even simple splits (better with named blocks), like...
    content = html.split('{%% block %s %%}'%(block))[-1]
    content = content.split('{%% endblock %%}')[0]
    return content

And to use it:

{% 'description'|get_block('template1.html') %}

Upvotes: 3

Related Questions