Recientemente actualicé Django de v1.3.1 a v1.4.
En mi viejo settings.py
tengo
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.
)
Esto apuntará a /Users/hobbes3/Sites/mysite/templates
, pero porque Django v1.4 movió la carpeta del proyecto al mismo nivel que las carpetas de la aplicación , mi settings.py
archivo ahora está en /Users/hobbes3/Sites/mysite/mysite/
lugar de /Users/hobbes3/Sites/mysite/
.
Entonces, en realidad mi pregunta ahora es doble:
- ¿Cómo uso
os.path
para mirar un directorio un nivel superior desde__file__
? En otras palabras, quiero/Users/hobbes3/Sites/mysite/mysite/settings.py
encontrar/Users/hobbes3/Sites/mysite/templates
usando rutas relativas. - Debería ser de mantenimiento de la
template
carpeta (que tiene plantillas cruzada de aplicaciones, comoadmin
,registration
, etc.) en el proyecto de/User/hobbes3/Sites/mysite
nivel o en/User/hobbes3/Sites/mysite/mysite
?
os
paracd
que../mysite
? O cualquier comando que deseesettings.py
en varios servidores. La única diferencia podría ser las credenciales de la base de datos. Estaba leyendo laos.path
documentación pero no pude encontrar un comando que te permitiera subir un directorio. Al igualcd ..
.os.path.join( os.path.dirname( __file__ ), '..' )
..
significar el directorio de arriba en todo el sistema de archivos, no solo cuando se pasa acd
.os.path.join( os.path.dirname ( __file__), os.path.pardir)
Respuestas:
En cuanto a dónde debe ir la carpeta de plantillas, no lo sé desde que salió Django 1.4 y aún no lo he mirado. Probablemente debería hacer otra pregunta sobre SE para resolver ese problema.
También puede usar
normpath
para limpiar el camino, en lugar deabspath
. Sin embargo, en esta situación, Django espera una ruta absoluta en lugar de una ruta relativa.Para compatibilidad multiplataforma, use en
os.pardir
lugar de'..'
.fuente
..
o algo así? ¿Por qué esta respuesta obtiene menos votos?normpath
. Además, atravesará los enlaces simbólicos correctamente./Users/hobbes3/Sites/mysite/mysite/../templates
perfectamente perfecta, pero un poco más desordenada. También asegura que se obedezca el recordatorio de Django para usar rutas absolutas. Si se encuentra en una situación diferente que usa una ruta relativa, debe usar normpath para simplificar sus rutas.os.pardir
, nunca llegué al final de losos
documentos)Para obtener la carpeta de un archivo simplemente use:
Para obtener una carpeta, simplemente úsela
os.path.dirname
nuevamenteEs posible que desee comprobar si
__file__
es un enlace simbólico:fuente
n
carpetas sin tener que llamar a lasos.path.dirname
n
horas?pathlib.Path.parents[levels_up-1]
. Vea esta pregunta para obtener más solucionesSi está utilizando Python 3.4 o más reciente, una forma conveniente de subir varios directorios es
pathlib
:fuente
Quieres exactamente esto:
fuente
Personalmente, iría por el enfoque funcional
fuente
os.path.dirname('/tmp/lala/')
aún devuelve'/tmp/lala'
Creo que lo más fácil es reutilizar dirname () para que pueda llamar
si el archivo está en /Users/hobbes3/Sites/mysite/templates/method.py
Esto devolverá "/ Users / hobbes3 / Sites / mysite"
fuente
Actualizar:
Si sucede que "copia" a
settings.py
través del enlace simbólico, la respuesta de @ forivall es mejor:El método anterior 'verá'
wrong.html
mientras que el método de @ forivall veráright.html
En ausencia de enlaces simbólicos, las dos respuestas son idénticas.
fuente
Esto puede ser útil para otros casos en los que desea subir x carpetas. Solo corre
walk_up_folder(path, 6)
para subir 6 carpetas.fuente
for _ in xrange(depth)
lugar de hacer un seguimiento de la variable local.Para un paranoico como yo, preferiría este
fuente
'/'
que debería usaros.sep
Para subir
n
carpetas ... ejecutaup(n)
fuente
Por supuesto: simplemente usar
os.chdir(..)
.fuente
Con el uso
os.path
podemos subir un directorio asíTambién después de encontrar el directorio que desea, puede unirse con otra ruta de archivo / directorio
fuente