Render the content of a specific block tag from a Django template. Works for
arbitrary template inheritance, even if a block is defined in the child template
but not in the parent. Generally it works like render_to_string
from Django,
but allows you to specify a block to render.
- Render a specific block from a template
- Fully supports the Django templating engine
- Partially supports the Jinja2 engine: it does
not currently process the
extends
tag.
Django Render Block supports Django 1.8 and 1.9.
In test1.html
:
{% block block1 %}block1 from test1{% endblock %}
{% block block2 %}block2 from test1{% endblock %}
In test2.html
:
{% extends 'test1.html' %}
{% block block1 %}block1 from test2{% endblock %}
And from the Python shell:
>>> from render_block import render_block_to_string
>>> print render_block_to_string('test2.html', 'block1')
u'block1 from test2'
>>> print render_block_to_string('test2.html', 'block2')
u'block2 from test1'
It can also accept a context as a dict
(just like render_to_string
), in
test3.html
:
{% block block3 %}Render this {{ variable }}!{% endblock %}
And from Python:
>>> print render_block_to_string('test3.html', 'block3', {'variable': 'test'})
u'Render this test!'
The API is simple and attempts to mirror the built-in render_to_string
API.
render_block_to_string(template_name, block_name, context=None)
template_name
- The name of the template to load and render. If it’s a list of template names, Django uses
select_template()
instead ofget_template()
to find the template.block_name
- The name of the block to render from the above template.
context
A
dict
to be used as the template’s context for rendering.
context
is now optional. An empty context will be used if it isn’t provided.
Like render_to_string
this will raise the following exceptions:
TemplateDoesNotExists
- Raised if the template(s) specified by
template_name
cannot be loaded.TemplateSyntaxError
- Raised if the loaded template contains invalid syntax.
There are also two additional errors that can be raised:
BlockNotFound
- Raised if the block given by
block_name
does not exist in the template.UnsupportedEngine
- Raised if a template backend besides the Django backend is used.
If you find a bug or have an idea for an improvement to Django Render Block, please file an issue or provide a pull request! Check the list of issues for ideas of what to work on.
This is based on a few sources:
- Originally Django Snippet 769
- Updated version Django Snippet 942
- A version of the snippets was ported as Django-Block-Render
- Additionally inspired by part of django-templated-email
- Also based on a StackOverflow answer 2687173