La réponse de @ error est fondamentalement juste, vous devriez utiliser une balise de modèle pour cela. Cependant, je préfère une balise de modèle légèrement plus générique que je peux utiliser pour effectuer tout type d'opérations similaires à celle-ci:
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 ''
et ensuite vous pouvez l'utiliser comme ceci dans votre modèle:
{% captureas template %}shop/{{ shop_name }}/base.html{% endcaptureas %}
{% include template %}
Comme le commentaire le mentionne, cette balise de modèle est particulièrement utile pour les informations qui sont répétables dans tout un modèle mais qui nécessitent une logique et d'autres éléments qui accrocheront vos modèles, ou dans les cas où vous souhaitez réutiliser les données passées entre les modèles via des blocs:
{% captureas meta_title %}{% spaceless %}{% block meta_title %}
{% if self.title %}{{ self.title }}{% endif %}
{% endblock %}{% endspaceless %} - DEFAULT WEBSITE NAME
{% endcaptureas %}
puis:
<title>{{ meta_title }}</title>
<meta property="og:title" content="{{ meta_title }}" />
<meta itemprop="name" content="{{ meta_title }}">
<meta name="twitter:title" content="{{ meta_title }}">
Le crédit pour le tag captureas est dû ici: https://www.djangosnippets.org/snippets/545/