Включение шаблона Django не разделяет статические файлы

У меня есть большой проект Django с несколькими шаблонами, которые позже объединяются для динамического построения страниц, я столкнулся со следующей странной проблемой:

  1. I have a base.html which includes all the needed imports, including JS and CSS.

  2. I have sub-folders for both CSS/JS in the assets, which are usually imported at the end of base.html.

Теперь, когда мой проект стал больше, я решил, что лучше будет импортировать скрипты, например:

<script type="text/javascript" src="{% static "js/base.js" %}"></script>
<script type="text/javascript" src="{% static "js/menus/projects.js" %}"></script>
<script type="text/javascript" src="{% static "js/menus/sensors.js" %}"></script>

включенные в каждый отдельный HTML-файл, вместо того, чтобы все они были в base.html, я ожидал, что проблем не будет, поскольку, насколько я знаю, утверждения include также должны передавать контекст, для справки, вот интересующие меня утверждения include:

  • в base.html:
{% include "applications/Devices/deviceDashboard.html" %}
  • в deviceDashboard.html:
{% include "applications/Devices/deviceDashboard/listCard.html" %}
{% include "applications/Devices/deviceDashboard/editCard.html" %}
{% include "applications/Devices/deviceDashboard/graphCard.html" %}

Во всех этих случаях, если я пытаюсь запустить его как есть, я получаю следующее:

TemplateSyntaxError at /

Invalid block tag on line 25: 'static'. Did you forget to register or load this tag?

Когда я пытаюсь использовать те же теги импорта сценариев, что и раньше, и эта проблема исчезает, когда я использую {% load static %} для каждой отдельной страницы.

Почему include не копирует контекст здесь? Или он по умолчанию не копирует "static"? Я подозреваю, что это простое непонимание с моей стороны того, как include должен работать здесь, но я не смог ничего найти во время поиска. Наконец, если импорт работает именно так, то как я могу решить эту проблему?

Определите настройки статических файлов в файле django project settings.py

STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"

Также добавьте это в основной urls.py вашего проекта

urlpatterns += static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Тег шаблона load в Django загружает пакеты только для конкретного файла шаблона, и они не наследуются через теги extends или include.

Смотрите для объяснения это сообщение об ошибке:

Насколько я понимаю, это особенность, а не ошибка. Система шаблонов система предоставляет только теги, загруженные в каждый файл шаблона, чтобы чтобы шаблоны можно было использовать повторно без необходимости догадываться об их ожидания окружения.

Исправление проблемы, связанной с необходимостью поместить {% load i18n %} в каждом шаблоне может быть добавление специфического для каждого приложения автоматически загружаемые настройки шаблона, так что каждый автор приложения может решить что является базовым пространством имен для их шаблонов. Это потребует добавить систему конфигурации для конкретного приложения и каким-то образом позволить модулю шаблона модулю шаблона знать, что такое "текущее приложение".

Если вы хотите, чтобы определенные теги были доступны во всех шаблонах, вы можете использовать подход, использованный здесь: Загрузить статические файлы для всех шаблонов в django

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