2009-03-22 12 views
12

Estoy trabajando en un sitio de Django que tiene múltiples secciones y subsecciones. Me gustaría tener varias profundidades de herencia de plantillas: una plantilla base para todo el sitio, una plantilla base para cada sección que hereda de la plantilla raíz y así sucesivamente. Aquí hay una versión simplificada de la estructura de mi directorio deseado:Django: especificando una plantilla base por directorio

base.html 
section1/ 
    base.html 
section2/ 
    base.html 
section3/ 
    base.html 

Lo que yo deseo es que todos los archivos bajo section1/ para contener algo así como {% extends "base.html" %}, lo que significa que se extenderían section1/base.html. section1/base.html contendría algo así como {% extends "../base.html" %}, lo que significa que extendería el archivo base de nivel raíz. Sin embargo, no pude encontrar nada en la documentación que sugiriera que esto fuera posible, y no pude hacer que Django distinguiera entre "../base.html" y "base.html". ({% extends "../base.html" %} arroja un error.) Supongo que una solución sería cambiar el nombre de todos los archivos base base_SECTIONNAME.html y actualizar todos los archivos que hereden de ellos, pero me preocupa que esto pueda volverse difícil de mantener a medida que mi sitio crezca y las secciones cambien de nombre. , etc. Preferiría una solución que aproveche la jerarquía natural especificada por directorios y subdirectorios.

¿Alguna idea?

Respuesta

18

Puede que supervise algo, pero todo lo que desea puede lograrse con el sistema de plantilla django. Todas las llamadas de extensión son relativas a los directorios de plantilla.

  1. A fin de que todos los archivos en los subdirectorios base.html extender base.html, sólo hay que poner un {% extends "base.html" %} en los archivos. section1/base.html se vería así.

    {% extends "base.html" %}

    {# ... rest of your code ...#}

  2. Ahora, para obtener los archivos de la sección 1 de extender section1/base.html sólo hay que poner {% extends "section1/base.html" %} en la parte superior de ellos. Lo mismo para la sección 2, la 3 y así sucesivamente.

Es así de simple, pero podría no ser totalmente obvio en la documentación.

Espero, entendí su pregunta.

+2

Derecha ... las rutas relativas no funcionarán con extends. –

+1

Y no pueden, porque puede tener plantillas en varios lugares. –

+3

Vale la pena mencionar que todas las carpetas (/ root,/root/section1,/root/section2, ...) deben configurarse como django TEMPLATE_DIRS, de lo contrario, no funciona. –

5

La respuesta aceptada funcionará, pero recomiendo usar nombres de variables para realizar un seguimiento de la estructura de la sección. Mi preferencia personal sería context processor. Si, por ejemplo, la organización de la sección de su sitio se refleja de forma transparente en la URL, intente algo como:

# It may be convenient to make this function live in or near your url conf. 
def convert_url_path_to_folder_path(path): 
    # fill in the magic here 

def sub_folder_available(request): 
    folder = convert_url_path_to_folder_path(request.path) 
    return {'subsection': folder, 'local_base':folder+'/base.html'} 

Luego, en su plantilla, se puede

{% extends local_base %} 

Hay probablemente una docena de otras formas de hacerlo esto, pero lo principal es pensar en evitar codificar el nombre de la carpeta en la plantilla. Esto le permitirá obtener una gran cantidad de millas recorridas, sobre todo porque puede arrastrar y colocar plantillas entre secciones si resultan lo suficientemente similares.Otra cosa que podría añadir inserto es:

def sub_folder_available(request): 
    folder = convert_url_path_to_folder_path(request.path) 
    # Check if local base exists: 
    if os.access(folder+'/base.html',os.F_OK): 
     base = folder+'/base.html' 
    else: 
     # revert to your global base 
     base = 'base.html' 
    return {'subsection': folder, 'base':base} 

La buena ventaja de esta estrategia es, por supuesto, que se puede obtener una sección volante peso en marcha y funcionando sin ningún tipo de plantilla de base local en absoluto.

+0

Bonita publicación. No estoy seguro, si pierdo más de lo que gano con esta solución. Tengo que evaluar esto. –

+0

Obviamente es caso por caso. Solo insinuando qué capas adicionales de organización pueden entrar en juego. –

0

Puede utilizar esta biblioteca: https://github.com/vb64/django.templates.relative.path

Sólo tiene que escribir en sus plantillas de la siguiente manera:

{% RELATIVE_PATH carga%} {% extiende ".base.html" %}

este se extenderá plantilla "base.html", que se encuentra en la misma carpeta, donde la plantilla coloca

{% RELATIVE_PATH carga%} {% extiende "... base.html" %}

ampliar plantilla "base.html", ubicado en dos niveles superiores

mismas cosas funciona con la etiqueta 'include'.

Cuestiones relacionadas