Как установить динамические seo теги в шаблоне django

Я работаю над проектом djanog и хочу выводить динамические метатеги и заголовки для каждой страницы в нем. На данный момент я пытаюсь сделать это следующим образом Я добавил блок в файл header.html следующим образом

{% block seo %}
{% endblock %}

иерархия главного шаблона (от которого расширяются все остальные шаблоны)

{% include 'header.html' %}
{% include 'menu.html' %}
{% block body %}
{% endblock %}
{% include 'footer.html' %}

Теперь в шаблонах приложений я пытаюсь отобразить эти seo теги следующим образом

{% extends 'main.html' %}
{% block seo %}
<title>example.cpm</title>
<mete name="description" content="lorem ipsum">
{% endblock %}

но этот подход не работает для меня, пожалуйста, помогите мне в этом отношении

Движок шаблонов Django не поддерживает это. Вы должны поместить заполнитель seo блока в ваш основной шаблон, иначе он не будет отображаться при расширении.

{% block seo %}
{% endblock %}
{% include 'menu.html' %}
{% block body %}
{% endblock %}
{% include 'footer.html' %}

Вы должны определить это в header.html :

{% block seo %}
    <title>example.cpm</title>
    <meta name="description" content="lorem ipsum">
{% endblock %}

И нет необходимости переопределять блок seo в шаблоне приложения.

Согласно документации, тег include следует рассматривать как реализацию "отрисовки этого подшаблона и включения HTML", а не как "разбор этого подшаблона и включение его содержимого, как если бы он был частью родительского". Это означает, что между включаемыми шаблонами нет общего состояния - каждый включаемый шаблон является полностью независимым процессом рендеринга.

Блоки оцениваются до их включения. Это означает, что шаблон, включающий блоки из другого шаблона, будет содержать блоки, которые уже были оценены и отображены, а не блоки, которые могут быть переопределены, например, расширяющим шаблоном.

Самый простой способ - создать поля, содержащие ваш seo и затем вывести их в шаблон

{% block seo %}
    <title>example.cpm</title>
    <meta name="description" content="lorem ipsum">
{% endblock %}

теперь запустим функцию просмотра

def meta(request,pk):
     meta=Meta.objects.get(id=pk)
     return render(request, 'index.html', {'meta':meta})
% block seo %}
    <title>example.cpm</title>
    <meta name="description" content="lorem ipsum">
{% endblock %}
Вернуться на верх