J'ai récemment mis à niveau Django de la v1.3.1 vers la v1.4.
Dans mon ancien settings.py
j'ai
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.
)
Cela indiquera /Users/hobbes3/Sites/mysite/templates
, mais parce que Django v1.4 a déplacé le dossier du projet au même niveau que les dossiers d'application , mon settings.py
fichier est maintenant à la /Users/hobbes3/Sites/mysite/mysite/
place de /Users/hobbes3/Sites/mysite/
.
Donc en fait ma question est maintenant double:
- Comment puis-je utiliser
os.path
pour regarder un répertoire un niveau au-dessus de__file__
. En d'autres termes, je veux/Users/hobbes3/Sites/mysite/mysite/settings.py
trouver en/Users/hobbes3/Sites/mysite/templates
utilisant des chemins relatifs. - Dois - je garderai le
template
dossier (qui a des modèles cross-app, commeadmin
,registration
, etc.) au projet/User/hobbes3/Sites/mysite
niveau ou à/User/hobbes3/Sites/mysite/mysite
?
os
pourcd
de../mysite
? Ou quelle que soit la commande que vous voulezsettings.py
sur plusieurs serveurs. La seule différence pourrait être les informations d'identification de la base de données. Je lisais laos.path
documentation mais je n'ai pas trouvé de commande qui vous permette de remonter dans un répertoire. Commecd ..
.os.path.join( os.path.dirname( __file__ ), '..' )
..
signifie le répertoire ci - dessus à travers le système de fichiers, pas seulement lorsqu'il est passé àcd
.os.path.join( os.path.dirname ( __file__), os.path.pardir)
Réponses:
En ce qui concerne le dossier des modèles, je ne sais pas depuis que Django 1.4 vient de sortir et je ne l'ai pas encore regardé. Vous devriez probablement poser une autre question sur SE pour résoudre ce problème.
Vous pouvez également utiliser
normpath
pour nettoyer le chemin plutôt queabspath
. Cependant, dans cette situation, Django attend un chemin absolu plutôt qu'un chemin relatif.Pour la compatibilité multiplateforme, utilisez
os.pardir
plutôt que'..'
.la source
..
ou quelque chose? Pourquoi cette réponse obtient-elle moins de votes?normpath
. De plus, il traversera correctement les liens symboliques./Users/hobbes3/Sites/mysite/mysite/../templates
, ce qui est parfaitement bien, mais juste un peu plus encombré. Il garantit également que le rappel de Django d'utiliser des chemins absolus est respecté. Si vous êtes dans une situation différente qui utilise un chemin relatif, vous devez plutôt utiliser normpath pour simplifier vos chemins.os.pardir
jamaisos
Pour obtenir le dossier d'un fichier, utilisez simplement:
Pour ouvrir un dossier, utilisez-le à
os.path.dirname
nouveauVous voudrez peut-être vérifier s'il
__file__
s'agit d'un lien symbolique:la source
n
dossiers sans avoir à appeler lesos.path.dirname
n
heures?pathlib.Path.parents[levels_up-1]
. Voir cette question pour plus de solutionsSi vous utilisez Python 3.4 ou une version plus récente, un moyen pratique de remonter plusieurs répertoires est le suivant
pathlib
:la source
Vous voulez exactement ceci:
la source
Personnellement, j'opterais pour l'approche fonctionnelle
la source
os.path.dirname('/tmp/lala/')
toujours retour'/tmp/lala'
Je pense que la chose la plus simple à faire est simplement de réutiliser dirname () afin que vous puissiez appeler
si votre fichier se trouve dans /Users/hobbes3/Sites/mysite/templates/method.py
Cela renverra "/ Users / hobbes3 / Sites / mysite"
la source
Mettre à jour:
S'il vous arrive de "copier"
settings.py
via la liaison symbolique, la réponse de @ forivall est meilleure:La méthode ci-dessus 'verra'
wrong.html
tandis que la méthode de @ forivall verraright.html
En l'absence de liens symboliques, les deux réponses sont identiques.
la source
Cela peut être utile dans d'autres cas où vous souhaitez remonter x dossiers. Il suffit de courir
walk_up_folder(path, 6)
pour monter 6 dossiers.la source
for _ in xrange(depth)
au lieu de garder une trace de la variable locale.Pour un paranoïaque comme moi, je préfère celui-ci
la source
'/'
vous devriez utiliseros.sep
Pour remonter les
n
dossiers ... exécutezup(n)
la source
Bien sûr: utilisez simplement
os.chdir(..)
.la source
Avec l'aide,
os.path
nous pouvons monter un répertoire comme çaégalement après avoir trouvé le répertoire que vous voulez, vous pouvez vous joindre à un autre chemin de fichier / répertoire
la source