Дублирование содержимого блока в шаблоне 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, поэтому > следует переписать в &gt;, а & в &amp;. Язык шаблонов Django автоматически делает это с переменными, а не с блоками.

Вернуться на верх