Хорошо, через полтора месяца я решил просто просмотреть документы и посмотреть, смогу ли я сам разобраться с этим.И у меня есть рабочее решение.Вот как это сделать.
ШАГ 1: добавьте несколько каталогов и настройте некоторые новые переменные в настройках.
Во-первых, я предполагаю, что у вас уже есть такая структура каталогов для статических файлов:
/<app_name>/static/<app_name>
Добавить еще один подкаталог с названием "шаблоны".Здесь мы сделаем наши шаблоны.Это не то место, где они будут сохранены.Теперь у вас должно быть следующее:
/<app_name>/static/<app_name>/templates
В этом каталоге добавьте свой шаблон CSS.Вот мой пример, сохраненный как «test.css»:
{% load static %}
body {
background-image: url("{% static 'citator/citator.jpg %}");
}
Теперь добавьте эти переменные в настройки.Обратите внимание, у меня есть только одно приложение.Если у вас есть больше, найдите более управляемый способ сделать это:
APP_NAME = "<your app's name>"
STATIC_TEMPLATE_PATH = os.path.join(BASE_DIR, APP_NAME, "static", APP_NAME, "templates")
Далее нам нужно написать пользовательскую команду, которая будет запускать Django Template Engine на этих шаблонах.Для этого перейдите к:
/<app_name>/management/commands
Если у вас нет этих каталогов, создайте их.
Затем вам нужно создать файл, назовите его что-то вроде "render_static_templates.py", с этим в этом, в этом каталоге:
from django.core.management.base import BaseCommand
from django.template import engines
from <project_name>.settings import STATIC_TEMPLATE_PATH, APP_NAME
import glob
import os
def find_templates(stem: str):
"""
Custom template finder that just looks in
your new static templates directories for templates
"""
leaf = "*"
path = os.path.join(stem, leaf)
all_templates = glob.glob(path)
return all_templates
class Command(BaseCommand):
def handle(self, *args, **options):
# Get the file paths for all our new static templates:
all_templates = find_templates(STATIC_TEMPLATE_PATH)
# See docs: https://docs.djangoproject.com/en/2.1/topics/templates/
django_engine = engines['django']
for path in all_templates:
template = django_engine.get_template(path)
# Debug if you want. The URL should now be resolved in this print output.
print(template.render())
# Now we need to save the RENDERED template somewhere. I save it up one level from the templates folder, so that collectstatic can find it. You can put it elsewhere.
leaf = path.split("/")[-1]
save_path = os.path.join(APP_NAME, "static", APP_NAME, leaf)
# Debug
print(save_path)
with open(save_path, "w") as f:
f.write(template.render())
Что вы делаете дальше, это запускаете эту новую команду управления:
python manage.py render_static_templates
Теперь вы должны видеть отображенный шаблонв
/app/static/app
Следующий запуск
python manage.py collectstatic
При условии, что у вас правильно настроены STATIC_ROOT и STATIC_URL, вы получите перенесенный шаблон туда, где он должен быть.В моем случае:
/static/<app_name>
Оттуда шаблон RENDERED будет подан с использованием того, что вы используете для обслуживания.(Я использую белизну).И если все прошло хорошо, вы должны увидеть фоновое изображение на своей странице!
Возможные улучшения: - Улучшена структура каталогов.- Интеграция в команду "collect_static".