Django; Как я могу обслуживать шаблоны / изображения / css / js из пользовательского каталога ‘skin’?

#python #django #web-applications #frameworks

#python #django #веб-приложения #фреймворки

Вопрос:

Я пытаюсь создать проект Django с возможностью редактирования.

С чем у меня возникают проблемы, так это с выяснением того, как я могу обслуживать файлы из каталога skin, а не из каталога media, чтобы все изображения / css / js-файлы skin могли находиться в папках skin.

Пользователь должен иметь возможность выбирать имя обложки, предпочтительно, изменяя только переменную SKIN_NAME в ‘settings’ (и, возможно, позже файл .ini). И все шаблоны / css / изображения будут загружены из этого каталога.

Я полагаю, что возможность просмотра необработанных шаблонов была бы плохой, поэтому, возможно, это должен быть каталог ‘media’ внутри папки skin, с вложенными папками ‘css’, ‘js’ и ‘images’ внутри, и он будет обслуживаться оттуда.

Я довольно новичок в Django Framework, хотя у меня есть некоторый опыт работы с Python, поэтому я был бы очень признателен за любую информацию о том, как это делается / может быть сделано.

Ответ №1:

Во-первых, вам лучше хранить свои статические файлы в static папке и использовать только media для загруженного контента.

Тогда в вашей static папке у вас могла бы быть папка для каждого вашего скина, содержащая все необходимые CSS, изображения и JS.

Из вашего шаблона обложки просто импортируйте файлы с префиксом {{ STATIC_URL }} и вашим именем обложки.

 <link rel="stylesheet" src="{{ STATIC_URL }}name_of_your_skin/css/style.css" />
  

Если вашим скинам не нужен отдельный шаблон, вы могли бы даже сделать :

 <link rel="stylesheet" src="{{ STATIC_URL }}{{ skin_name }}/css/style.css" />
  

Комментарии:

1. Теперь в файле ‘settings’ я вижу, что MEDIA_ROOT предназначен для загруженных файлов. Но как мне задать статический путь, чтобы django мог обслуживать из него? Я могу найти только MEDIA_ROOT, который соответствует этому описанию.

Ответ №2:

Когда пользователь выбирает имя «skin», измените MEDIA_ROOT в своем файле настроек.

 PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) #assuming your settings file is in your project root
TEMPLATE_NAME = 'my_template'
MEDIA_ROOT = os.path.join(PROJECT_ROOT, "media", TEMPLATE_NAME)

print MEDIA_ROOT
# /path/to/project/media/my_template/
  

В дальнейшем, если это изменится на настраиваемую переменную настроек, которая будет изменена в Admin, вы, вероятно, могли бы достичь того же результата с помощью промежуточного программного обеспечения, которое изменяет значение MEDIA_ROOT.