Дублирование содержимого блока в шаблоне Django
Предположим, у меня есть следующий код в base.html
:
<meta name="description" content="{% block description %}Some description{% endblock %}">
Другие шаблоны, расширяющие base.html
, переопределяют содержимое блока, и поэтому каждая страница получает свое собственное описание.
Что, если я хочу добавить <meta property="og:description" content="" />
, где значение содержимого должно быть равно вышеуказанному значению?
Как добавить содержимое block
в другое место?
Не уверен, что {% block %}
- это та функция шаблона, которая вам нужна.
Думаю, можно задать переменную вместо блока:
<meta name="description" content="{{ description|default:"Some description"}}">
<meta name="og:description" content="{{ description|default:"Some description"}}">
И в каждом представлении можно определить extra_context
:
class YourView(View):
extra_context = {"description": "Your description"}
Идея состоит в том, чтобы использовать django-template-macros
. Таким образом, мы можем установить это с помощью:
pip install django-templates-macros
и добавьте его как одно из установленных приложений:
# settings.py
# …
INSTALLED_APPS = [
# …,
'macros',
# …
]
# …
и затем мы можем использовать это в «корневом» шаблоне как:
{% load macros %}
{% macro description %}
{% block description %}some description{% endblock %}
{% enddescription %}
<meta name="description" content="{% usemacro description %}">
<meta property="og:description" content="{% usemacro description %}"/>
Но, скорее всего, это не хорошая идея: описания должны быть закодированы в HTML, поэтому >
следует переписать в >
, а &
в &
. Язык шаблонов Django автоматически делает это с переменными, а не с блоками.