Расширение шаблона Django; django.template.exceptions.TemplateSyntaxError: Неверный тег блока при попытке загрузить i18n из базового шаблона
У меня есть base.html
файл шаблона для Django (4.1.2) в виде:
<!DOCTYPE html>
<html lang="en">
{% load static %}
{% load i18n %}
<head>
<meta charset="utf-8">
{% block title %}
<title>My Title</title>
{% endblock %}
</head>
<body>
{% block content %}
{% endblock content %}
</body>
</html>
и страницу index.html
на том же уровне в папке /templates
моего приложения, расширяющую базовую, как:
{% extends "base.html" %}
{% block content %}
<h1>My Django project</h1>
<ul>
<li><a href="/admin">{% trans "Admin" %}</a></li>
<li><a href="{% url 'foo' %}">{% trans "Foo" %}</a></li>
</ul>
{% endblock %}
Но когда я просматриваю последнюю страницу, сервер возвращает следующую ошибку:
django.template.exceptions.TemplateSyntaxError:
Invalid block tag on line 6:
'trans', expected 'endblock'.
Did you forget to register or load this tag?
Но если я просто добавляю {% load i18n %}
во вторую строку index.html
, страница загружается нормально.
Что не так с загрузкой базового шаблона на странице index.html?
Это не помогает, так как не отличает поведение, встречающееся здесь, от того, что загрузка, например, {% load django_bootstrap5 %}
в base.html
работает очень хорошо через все дочерние страницы без необходимости когда-либо указывать его снова на этих страницах.
Вы должны всегда загружать любую библиотеку тегов на каждой странице, если вы хотите использовать ее. Даже если вы уже загрузили ее на родительской странице.
Я нашел способ глобально включить i18n
в settings.py
:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
'builtins': ['django.templatetags.i18n'], # <---- add this line
},
]
Тогда, очевидно, вам больше не нужно загружать этот тег шаблона в каждый html-шаблон. Он больше не нужен даже в base.html
.
Подробнее о шаблонах, встроенных в бэкенды: https://docs.djangoproject.com/en/4.1/topics/templates/#module-django.template.backends.django
И написание {% load i18n %} только один раз: https://code.djangoproject.com/ticket/1193
Инспирировано: По умолчанию загружайте библиотеку тегов шаблонов Django для всех представлений