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.pyarchivo 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.pathpara mirar un directorio un nivel superior desde__file__? En otras palabras, quiero/Users/hobbes3/Sites/mysite/mysite/settings.pyencontrar/Users/hobbes3/Sites/mysite/templatesusando rutas relativas. - Debería ser de mantenimiento de la
templatecarpeta (que tiene plantillas cruzada de aplicaciones, comoadmin,registration, etc.) en el proyecto de/User/hobbes3/Sites/mysitenivel o en/User/hobbes3/Sites/mysite/mysite?

osparacdque../mysite? O cualquier comando que deseesettings.pyen varios servidores. La única diferencia podría ser las credenciales de la base de datos. Estaba leyendo laos.pathdocumentació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
normpathpara 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.pardirlugar 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/../templatesperfectamente 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 lososdocumentos)Para obtener la carpeta de un archivo simplemente use:
Para obtener una carpeta, simplemente úsela
os.path.dirnamenuevamenteEs posible que desee comprobar si
__file__es un enlace simbólico:fuente
ncarpetas sin tener que llamar a lasos.path.dirnamenhoras?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.pytravés del enlace simbólico, la respuesta de @ forivall es mejor:El método anterior 'verá'
wrong.htmlmientras que el método de @ forivall veráright.htmlEn 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.sepPara subir
ncarpetas ... ejecutaup(n)fuente
Por supuesto: simplemente usar
os.chdir(..).fuente
Con el uso
os.pathpodemos subir un directorio asíTambién después de encontrar el directorio que desea, puede unirse con otra ruta de archivo / directorio
fuente