Я недавно обновил Django с версии 1.3.1 до версии 1.4.
В моем старом у settings.py
меня есть
TEMPLATE_DIRS = (
os.path.join(os.path.dirname( __file__ ), 'templates').replace('\\', '/'),
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
Это будет указывать /Users/hobbes3/Sites/mysite/templates
, но поскольку Django v1.4 переместил папку проекта на тот же уровень, что и папки приложений , мой settings.py
файл теперь /Users/hobbes3/Sites/mysite/mysite/
вместо /Users/hobbes3/Sites/mysite/
.
Так что на самом деле мой вопрос теперь имеет два аспекта:
- Как мне использовать,
os.path
чтобы посмотреть на каталог на один уровень выше__file__
. Другими словами, я хочу/Users/hobbes3/Sites/mysite/mysite/settings.py
найти/Users/hobbes3/Sites/mysite/templates
использование относительных путей. - Должен ли я хранить
template
папку (в которой есть шаблоны разных приложений, напримерadmin
,registration
и т. Д.) На/User/hobbes3/Sites/mysite
уровне проекта или на уровне/User/hobbes3/Sites/mysite/mysite
?
os
дляcd
в../mysite
? Или любую команду, которую вы хотитеsettings.py
нескольких серверах. Единственной разницей могут быть учетные данные базы данных. Я читалos.path
документацию, но не смог найти команду, которая позволила бы вам перейти на один каталог. Какcd ..
.os.path.join( os.path.dirname( __file__ ), '..' )
..
означает , что каталог выше по всей файловой системе, а не только при передачеcd
.os.path.join( os.path.dirname ( __file__), os.path.pardir)
Ответы:
Относительно того, куда должна идти папка с шаблонами, я не знаю, так как Django 1.4 только что вышел, и я еще не смотрел на нее. Возможно, вам следует задать еще один вопрос по SE, чтобы решить эту проблему.
Вы также можете использовать
normpath
для очистки пути, а неabspath
. Однако в этой ситуации Джанго ожидает абсолютный путь, а не относительный путь.Для кроссплатформенной совместимости используйте
os.pardir
вместо'..'
.источник
..
или что-то в этом роде? Почему этот ответ получает меньше голосов?normpath
. Кроме того, он будет правильно проходить символические ссылки./Users/hobbes3/Sites/mysite/mysite/../templates
, что вполне нормально, но немного более загромождено. Это также обеспечивает выполнение напоминания Django об использовании абсолютных путей. Если вы находитесь в другой ситуации, в которой используется относительный путь, вам следует использовать normpath для упрощения ваших путей.os.pardir
, никогда не дошел до сутиos
документов)Чтобы получить папку файла просто используйте:
Чтобы получить папку, просто используйте
os.path.dirname
сноваВы можете проверить,
__file__
является ли символическая ссылка:источник
n
папкам без необходимости звонитьos.path.dirname
n
раз?pathlib.Path.parents[levels_up-1]
. Посмотрите этот вопрос для получения дополнительных решенийЕсли вы используете Python 3.4 или новее, удобный способ перемещения вверх по нескольким каталогам
pathlib
:источник
Вы хотите именно это:
источник
Лично я бы пошел на функциональный подход
источник
os.path.dirname('/tmp/lala/')
прежнему возвращается'/tmp/lala'
Я думаю, что самое простое - просто повторно использовать dirname (), чтобы вы могли
если ваш файл находится по адресу /Users/hobbes3/Sites/mysite/templates/method.py
Это возвратит "/ Users / hobbes3 / Sites / mysite"
источник
Обновить:
Если вам случится «копировать» с
settings.py
помощью символических ссылок, ответ @ forivall лучше:Приведенный выше метод «увидит»,
wrong.html
а метод @ forivall увидитright.html
В отсутствие символических ссылок оба ответа идентичны.
источник
Это может быть полезно для других случаев, когда вы хотите перейти на x папок вверх. Просто запустите,
walk_up_folder(path, 6)
чтобы перейти на 6 папок.источник
for _ in xrange(depth)
вместо отслеживания локальной переменной.Для параноика, как я, я бы предпочел этот
источник
'/'
вас следует использоватьos.sep
Чтобы перейти
n
папки вверх ... запуститьup(n)
источник
Конечно, просто используйте
os.chdir(..)
.источник
С помощью
os.path
мы можем перейти на один каталог вверх, как этотакже после нахождения нужного вам каталога вы можете присоединиться с другим путем к файлу / каталогу
источник