A resposta do @ error é fundamental, você deve usar uma tag de modelo para isso. No entanto, prefiro uma tag de modelo um pouco mais genérica que possa ser usada para executar qualquer tipo de operação semelhante a esta:
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 ''
e então você pode usá-lo assim em seu modelo:
{% captureas template %}shop/{{ shop_name }}/base.html{% endcaptureas %}
{% include template %}
Como o comentário menciona, essa tag de modelo é particularmente útil para informações repetíveis em um modelo, mas requer lógica e outras coisas que irão influenciar seus modelos ou nos casos em que você deseja reutilizar os dados passados entre os modelos através de blocos:
{% captureas meta_title %}{% spaceless %}{% block meta_title %}
{% if self.title %}{{ self.title }}{% endif %}
{% endblock %}{% endspaceless %} - DEFAULT WEBSITE NAME
{% endcaptureas %}
e depois:
<title>{{ meta_title }}</title>
<meta property="og:title" content="{{ meta_title }}" />
<meta itemprop="name" content="{{ meta_title }}">
<meta name="twitter:title" content="{{ meta_title }}">
O crédito para a tag captureas é devido aqui: https://www.djangosnippets.org/snippets/545/