I have some html structures that are reused in quite a few different places. It's different from a overall template so I can't extend it, it can also be used to contain complicated content so I don't think defining it as a template tag does a good job. Below is some pseudo code describing my desired outcome, when using template_level2.html you can easily put stuff into the reusable_pattern_template by calling the block inside it. If I do use this code, what you write in 'actual content' of template_level_2.html wouldn't show up. How should I deal with this?
base.html
<html>
<head></head>
<body>
{% block content %}{% endblock %}
</body>
</html>
template_level1.html
{% extends 'base.html' %}
{% block content %}
Something here...
{% include 'reusable_pattern_template.html' %}
Something else here...
{% endblock %}
reusable_pattern_template.html
<div>
<div>
<div>
{% block local_content %}{% endblock %}
</div>
</div>
</div>
template_level2.html
{% extends 'template_level1.html' %}
{% block local_content %}
Actual content here...
{% endblock %}
update: Sorry, the extends in template_level2.html has some misspelling, I've just corrected it.
It may not be very clear, but the code above is more of a pseudo code describing my desired outcome. In short,
- I would like to include small pieces of reusable html patterns in my templates.
- These patterns are like boxes, that you can put whole pieces of html content in them. So context variables may be a bit of too limited for my purpose
Django does not process blocks in included files.
I came across this problem and ended up with the following compromise, hoping someone else might find it useful. It relies on using
with
blocks in the child templates.base.html wants to reuse a common nav.html include, but define some blocks where variables inside nav.html might be overriden by child templates.
The include template depends on a variable called
selected
, which base.html does not define, by default:But child pages can override that value as follows:
so, not perfect, I still have to have two separate blocks and use those
with
blocks twice, but it does allow me to override variables ininclude
blocks from the parent template.In short, you can create variables in whichever template you're planning to include e.g.
and then assign those variables wherever you include the template e.g.
You could split reusable_pattern_template into begin and end templates. Then in level1 you can go include begin, block, include end.
Alternatively you could pass a template name into reusable_pattern_template as a context variable and then include it in reusable_pattern_template. This will require changing the relationship between level1 and level2 in your example but is generally more powerful.
It seems that the final template is trying to extend itself (if it was in quotes).
You really don't need that much of complexity. It's actually pretty much simpler.
The base template should hold the skeleton of your template, then you can extend it to make customizations. For reusable code blocks that you don't want to include in your every view,
include
them where appropriate but don't use anyblock
,extends
orinclude
statement within the included file. Django will not parse those but thecontext variable
passed from the view can still be used.