Saya baru-baru ini meningkatkan Django dari v1.3.1 ke v1.4.
Di masa lalu settings.py
saya miliki
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.
)
Ini akan menunjuk ke /Users/hobbes3/Sites/mysite/templates
, tetapi karena Django v1.4 memindahkan folder proyek ke tingkat yang sama dengan folder aplikasi , settings.py
file saya sekarang di /Users/hobbes3/Sites/mysite/mysite/
bukan /Users/hobbes3/Sites/mysite/
.
Jadi sebenarnya pertanyaan saya sekarang ada dua:
- Bagaimana cara saya
os.path
melihat direktori satu tingkat di atas__file__
. Dengan kata lain, saya ingin/Users/hobbes3/Sites/mysite/mysite/settings.py
mencari/Users/hobbes3/Sites/mysite/templates
menggunakan jalur relatif. - Haruskah saya menjaga
template
folder (yang memiliki cross-aplikasi template, sepertiadmin
,registration
, dll) di proyek/User/hobbes3/Sites/mysite
tingkat atau/User/hobbes3/Sites/mysite/mysite
?
os
untukcd
ke../mysite
? Atau perintah apa pun yang Anda inginkansettings.py
di beberapa server. Satu-satunya perbedaan mungkin adalah kredensial basis data. Saya membacaos.path
dokumentasi tetapi saya tidak dapat menemukan perintah yang memungkinkan Anda naik satu direktori. Seperticd ..
.os.path.join( os.path.dirname( __file__ ), '..' )
..
berarti direktori di atas di seluruh sistem file, bukan hanya ketika diteruskan kecd
.os.path.join( os.path.dirname ( __file__), os.path.pardir)
Jawaban:
Sejauh mana folder templat harus pergi, saya tidak tahu karena Django 1.4 baru saja keluar dan saya belum melihatnya. Anda mungkin harus mengajukan pertanyaan lain pada SE untuk menyelesaikan masalah itu.
Anda juga dapat menggunakan
normpath
untuk membersihkan jalur, bukanabspath
. Namun, dalam situasi ini, Django mengharapkan jalur absolut daripada jalur relatif.Untuk kompatibilitas lintas platform, gunakan
os.pardir
sebagai ganti'..'
.sumber
..
atau sesuatu? Mengapa jawaban ini mendapatkan lebih sedikit suara?normpath
. Plus, itu akan melintasi symlink dengan benar./Users/hobbes3/Sites/mysite/mysite/../templates
, yang benar-benar baik-baik saja, tetapi hanya sedikit lebih berantakan. Ini juga memastikan bahwa pengingat Django untuk menggunakan jalur absolut dipatuhi. Jika Anda berada dalam situasi berbeda yang menggunakan jalur relatif, Anda harus menggunakan normpath untuk menyederhanakan jalur Anda.os.pardir
, tidak pernah benar-benar sampai ke bagian bawahos
dokumen)Untuk mendapatkan folder file cukup gunakan:
Untuk mendapatkan folder cukup gunakan
os.path.dirname
lagiAnda mungkin ingin memeriksa apakah
__file__
symlink:sumber
n
folder tanpa harus memanggilos.path.dirname
n
waktu?pathlib.Path.parents[levels_up-1]
. Lihat pertanyaan ini untuk solusi lebih lanjutJika Anda menggunakan Python 3.4 atau yang lebih baru, cara mudah untuk naik ke beberapa direktori adalah
pathlib
:sumber
Anda menginginkan ini:
sumber
Secara pribadi, saya akan pergi untuk pendekatan fungsi
sumber
os.path.dirname('/tmp/lala/')
masih kembali'/tmp/lala'
Saya pikir hal termudah untuk dilakukan adalah hanya menggunakan kembali dirname () Jadi Anda dapat menelepon
jika file Anda di / Pengguna / host3/Situs/mysite/templates/method.py
Ini akan mengembalikan "/ Pengguna / hobbes3 / Situs / situs saya"
sumber
Memperbarui:
Jika Anda kebetulan "menyalin"
settings.py
melalui symlinking, jawaban @ forivall lebih baik:Metode di atas akan 'melihat'
wrong.html
sedangkan metode @ forivall akan melihatright.html
Dalam ketiadaan symlinks dua jawaban identik.
sumber
Ini mungkin berguna untuk kasus lain di mana Anda ingin naik x folder. Jalankan saja
walk_up_folder(path, 6)
untuk naik 6 folder.sumber
for _ in xrange(depth)
alih-alih melacak variabel lokal.Untuk paranoid seperti saya, saya lebih suka yang ini
sumber
'/'
Anda harus menggunakanos.sep
Untuk membuka
n
folder ... jalankanup(n)
sumber
Tentu saja: cukup gunakan
os.chdir(..)
.sumber
Dengan menggunakan
os.path
kita bisa pergi satu direktori seperti itujuga setelah menemukan direktori yang Anda inginkan, Anda dapat bergabung dengan jalur file / direktori lainnya
sumber