Как установить динамические 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 %}