@ ответ об ошибке в корне верен, для этого вы должны использовать тег шаблона. Однако я предпочитаю чуть более универсальный тег шаблона, который я могу использовать для выполнения любых операций, подобных этим:
from django import template
register = template.Library()
@register.tag(name='captureas')
def do_captureas(parser, token):
"""
Capture content for re-use throughout a template.
particularly handy for use within social meta fields
that are virtually identical.
"""
try:
tag_name, args = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError("'captureas' node requires a variable name.")
nodelist = parser.parse(('endcaptureas',))
parser.delete_first_token()
return CaptureasNode(nodelist, args)
class CaptureasNode(template.Node):
def __init__(self, nodelist, varname):
self.nodelist = nodelist
self.varname = varname
def render(self, context):
output = self.nodelist.render(context)
context[self.varname] = output
return ''
и затем вы можете использовать это в своем шаблоне:
{% captureas template %}shop/{{ shop_name }}/base.html{% endcaptureas %}
{% include template %}
Как отмечается в комментарии, этот тег шаблона особенно полезен для информации, которая повторяется в шаблоне, но требует логики и других вещей, которые будут мешать вашим шаблонам, или в случаях, когда вы хотите повторно использовать данные, передаваемые между шаблонами через блоки:
{% captureas meta_title %}{% spaceless %}{% block meta_title %}
{% if self.title %}{{ self.title }}{% endif %}
{% endblock %}{% endspaceless %} - DEFAULT WEBSITE NAME
{% endcaptureas %}
, а затем:
<title>{{ meta_title }}</title>
<meta property="og:title" content="{{ meta_title }}" />
<meta itemprop="name" content="{{ meta_title }}">
<meta name="twitter:title" content="{{ meta_title }}">
Кредит для тега captureas можно получить здесь: https://www.djangosnippets.org/snippets/545/