2012-03-24 11 views
135

最近Djangoをv1.3.1からv1.4にアップグレードしました。私はこれは/Users/hobbes3/Sites/mysite/templatesを指しますが、because Django v1.4 moved the project folder to the same level as the app foldersますPythonのos.pathを使って、どのようにして1つのディレクトリに移動できますか?

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. 
) 

を持っている私の古いsettings.py

、私settings.pyファイルが/Users/hobbes3/Sites/mysite/mysite/の代わり/Users/hobbes3/Sites/mysite/になりました。

だから、実際に私の質問は今二つある:

  1. がどのように私は__file__から1つの階層上のディレクトリを見てos.pathを使用してください。つまり、/Users/hobbes3/Sites/mysite/mysite/settings.pyには、相対パスを使用して/Users/hobbes3/Sites/mysite/templatesが見つかります。
  2. は私がプロジェクト/User/hobbes3/Sites/mysiteレベルまたは/User/hobbes3/Sites/mysite/mysiteで(adminregistrationのようなクロスアプリテンプレートを持っている、など)templateフォルダを維持すべきか?
+0

あなたは '../ mysite'に' os'から 'cd'を使うだけですか?またはあなたが望むコマンドを – prelic

+0

@prelic Hmm?わかりません。私は複数のサーバで同じ 'settings.py'を使うので、パスのハードコーディングを避けようとしています。唯一の違いは、データベースの資格情報です。私は['os.path'ドキュメント(http://docs.python.org/library/os.path.html)を読んでいましたが、あなたは1つのディレクトリに上がるコマンドを見つけることができませんでした。 'cd ..'のように。 – hobbes3

+1

@ hobbes3 'os.path.join(os.path.dirname(__file__)、 '..')' ..'は、 'cd'に渡されたときだけでなく、ファイルシステム全体の_ディレクトリを意味します。 –

答えて

173
os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'templates')) 

ジャンゴ1.4がちょうど出てきたと私はまだそれを見ていないので、限りテンプレートフォルダが行くべき場所として、私は知りません。おそらくSE上の別の質問をしてその問題を解決するべきでしょう。

abspathではなく、normpathを使用してパスをクリーンアップすることもできます。しかし、この状況では、Djangoは相対パスではなく絶対パスを想定しています。

クロスプラットフォーム対応の場合は、'..'の代わりにos.pardirを使用してください。

+3

'..'などを使うのは悪い考えですか?なぜこの答えがより少ない投票を得ているのですか? – hobbes3

+1

なぜ投票が少なくなったのか分かりませんが、いつも使ってきたことです。これは[normpath'](http://docs.python.org/library/os.path.html#os.path.normpath)の例でも定義されています。さらに、シンボリックリンクを適切にトラバースします。 – forivall

+0

私はシンプルさが好きです!しかし、なぜ「伏せ」ですか?私はそれを以前は使用しておらず、 'settings.py'でもまだ動作していました。 – hobbes3

51

だけ使用したファイルのフォルダを取得するには:

os.path.dirname(path) 

をアップちょうどあなたが__file__がシンボリックリンクであるかどうかを確認したい場合があります再び

os.path.dirname(os.path.dirname(path)) 

os.path.dirnameを使用するフォルダを取得するには:

if os.path.islink(__file__): path = os.readlink (__file__) 
+6

'ns.'を' os.path.dirname'と呼ぶことなく 'n'フォルダに移動する方法はありますか? –

12

正確にこれが欲しい:

BASE_DIR = os.path.join(os.path.dirname(__file__), '..') 
6
from os.path import dirname, realpath, join 
join(dirname(realpath(dirname(__file__))), 'templates') 

更新:

あなたはシンボリックリンクを通じて、 "コピー" settings.pyに起こる場合は、@ forivallの答えは優れている:

~user/ 
    project1/ 
     mysite/ 
      settings.py 
     templates/ 
      wrong.html 

    project2/ 
     mysite/ 
      settings.py -> ~user/project1/settings.py 
     templates/ 
      right.html 

上記の方法はwrong.htmlしばらく '見る' だろう@ forivallの方法は表示されますright.html

シンボリックリンクがない場合、2つの答えは同じです。私のような被害妄想のために

+0

この方法に問題はありますか?それは素敵に見えますが、ちょっとハックアップしました;) – Gricha

+0

リンクをどう扱うかは、受け入れられた答えとは多少異なります。それ以外は同じです。 –

2

、私は個人的にこの1

TEMPLATE_DIRS = (
    __file__.rsplit('/', 2)[0] + '/templates', 
) 
+6

おそらく ''/''の代わりに 'os.sep'を使うべきです – djhaskin987

5

を好むだろう、私は、機能的なアプローチのために

def get_parent_dir(directory): 
    import os 
    return os.path.dirname(directory) 

current_dirs_parent = get_parent_dir(os.getcwd()) 
4

を行くと思い、私は一番簡単な方法は、ちょうどにあると思いますあなたはファイルの場合は、再利用のdirname() だから、あなたが

os.path.dirname(os.path.dirname(__file__)) 

を呼び出すことができます/ユーザ/ hobbes3 /サイト/です個人用サイト/テンプレート/ method.py

これは、「/ユーザ/ hobbes3 /サイト/個人用サイト」

3

これは、あなたがXフォルダを移動したい他の例のために役に立つかもしれませんが返されます。 walk_up_folder(path, 6)を実行すると、6つのフォルダに移動できます。

def walk_up_folder(path, depth=1): 
    _cur_depth = 1   
    while _cur_depth < depth: 
     path = os.path.dirname(path) 
     _cur_depth += 1 
    return path 
関連する問題