Recentemente, atualizei o Django da v1.3.1 para a v1.4.
Na minha idade settings.py
eu tenho
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.
)
Isso apontará para /Users/hobbes3/Sites/mysite/templates
, mas como o Django v1.4 moveu a pasta do projeto para o mesmo nível das pastas do aplicativo , meu settings.py
arquivo está agora em /Users/hobbes3/Sites/mysite/mysite/
vez de /Users/hobbes3/Sites/mysite/
.
Na verdade, minha pergunta agora é dupla:
- Como eu uso
os.path
para procurar um diretório um nível acima de__file__
. Em outras palavras, eu quero/Users/hobbes3/Sites/mysite/mysite/settings.py
encontrar/Users/hobbes3/Sites/mysite/templates
usando caminhos relativos. - Devo estar mantendo a
template
pasta (que tem modelos de cross-aplicação, comoadmin
,registration
, etc.) para o projeto/User/hobbes3/Sites/mysite
nível ou em/User/hobbes3/Sites/mysite/mysite
?
os
paracd
a../mysite
? Ou qualquer comando que você quersettings.py
em vários servidores. A única diferença pode ser as credenciais do banco de dados. Eu estava lendo aos.path
documentação, mas não consegui encontrar um comando que permita que você suba um diretório. Likecd ..
.os.path.join( os.path.dirname( __file__ ), '..' )
..
significa o diretório acima todo o sistema de arquivos, não apenas quando passou paracd
.os.path.join( os.path.dirname ( __file__), os.path.pardir)
Respostas:
Quanto aonde a pasta de templates deve ir, eu não sei desde que o Django 1.4 acabou de sair e ainda não a examinei. Você provavelmente deve fazer outra pergunta no SE para resolver esse problema.
Você também pode usar
normpath
para limpar o caminho, em vez deabspath
. No entanto, nesta situação, o Django espera um caminho absoluto, e não um caminho relativo.Para compatibilidade entre plataformas, use em
os.pardir
vez de'..'
.fonte
..
ou algo assim? Por que esta resposta está recebendo menos votos?normpath
. Além disso, ele percorrerá links simbólicos corretamente./Users/hobbes3/Sites/mysite/mysite/../templates
, o que é perfeitamente correto, mas um pouco mais confuso. Ele também garante que o lembrete do Django para usar caminhos absolutos seja obedecido. Se você estiver em uma situação diferente que usa um caminho relativo, use normpath para simplificar seus caminhos.os.pardir
, nunca cheguei ao fundo dosos
documentos)Para obter a pasta de um arquivo, basta usar:
Para abrir uma pasta, basta usar
os.path.dirname
novamenteConvém verificar se
__file__
é um link simbólico:fonte
n
pastas sem ter que ligar para oos.path.dirname
n
horário?pathlib.Path.parents[levels_up-1]
. Veja esta pergunta para obter mais soluçõesSe você estiver usando o Python 3.4 ou mais recente, uma maneira conveniente de mover vários diretórios é
pathlib
:fonte
Você quer exatamente isso:
fonte
Pessoalmente, eu iria para a abordagem de função
fonte
os.path.dirname('/tmp/lala/')
ainda retornar'/tmp/lala'
Acho que a coisa mais fácil é reutilizar o dirname () para que você possa ligar
se o seu arquivo estiver em /Users/hobbes3/Sites/mysite/templates/method.py
Isso retornará "/ Usuários / hobbes3 / Sites / meu site"
fonte
Atualizar:
Se você "copiar"
settings.py
por meio de ligação simbólica, a resposta do @ forivall é melhor:O método acima 'verá'
wrong.html
enquanto o método do @ forivall veráright.html
Na ausência de links simbólicos, as duas respostas são idênticas.
fonte
Isso pode ser útil para outros casos em que você deseja subir x pastas. Basta correr
walk_up_folder(path, 6)
para subir 6 pastas.fonte
for _ in xrange(depth)
vez de acompanhar a variável local.Para um paranóico como eu, eu preferiria este
fonte
'/'
você deve usaros.sep
Para subir as
n
pastas ... executeup(n)
fonte
Claro: basta usar
os.chdir(..)
.fonte
Com o uso
os.path
, podemos subir um diretório assimdepois de encontrar o diretório que você deseja, você pode ingressar em outro caminho de arquivo / diretório
fonte