2009-05-21 7 views
25

segunda vez pidiendo más detalles ...Django - ¿Cómo tener un proyecto templatetags ancho comparten entre todos mis aplicaciones en ese proyecto

Me gustaría tener un directorio de proyectos de ancho templagetags tener las etiquetas comunes utilizado por todas las aplicaciones, entonces cada aplicación puede tener sus propias etiquetas si es necesario.

Let decir que tengo:

proj1/app1 
proj1/app1/templatetags/app1_tags.py 

proj1/app2 
proj1/app2/templatetags/app2_tags.py 

proj1/templatetags/proj1_tags.py 

proj1/templates/app1/base.html 
proj1/templates/app1/index.html 
proj1/templates/app2/base.html 
proj1/templates/app2/index.html 

Dónde:

proj1/templates/app1/base.html 
----------- 
{% load proj1_tags %} 
{% load app1_tags %} 

proj1/templates/app1/index.html 
----------- 
{% extends "base.html" %} 

proj1/templates/app2/base.html 
----------- 
{% load proj2_tags %} 
{% load app2_tags %} 

proj1/templates/app2/index.html 
----------- 
{% extends "base.html" %} 

Que este trabajo? No funcionó para mí. No puede encontrar el proj1_tags para cargar.

Respuesta

36

No sé si este es el derecho manera de hacerlo, pero en mis aplicaciones Django, siempre me pongo etiquetas de plantillas comunes en una "aplicación" lib, así:

proj/ 
    __init__.py 
    lib/ 
     __init__.py 
     templatetags/ 
      __init__.py 
      common_tags.py 

Solo asegúrese de agregar la aplicación lib a su lista de INSTALLED_APPS en settings.py.

+2

general I Nombre de la aplicación después del proyecto: "project_core" - pero la misma solución. –

+3

'common' o' commons' también podría ser un buen nombre. –

+0

cómo llamarlo en archivos html? Solo '{% load common_tags%}'? – andi

3

Django registra templatetags globalmente para cada aplicación en INSTALLED_APPS (y es por eso que su solución no funciona: proyecto no es una solicitud tal como la entiende Django) — que están disponibles en todas las plantillas (con tal de que se registren adecuadamente)

Normalmente tengo una aplicación que maneja la funcionalidad miscelánea (como la página de inicio del sitio) y pongo etiquetas de plantilla no relacionadas con ninguna aplicación en particular, pero esto es puramente estético.

0

Django funciona por la aplicación. Se refieren en la configuración INSTALLED_APPS.

Te sugiero que separe todo lo relacionado con una aplicación diferente. Para el problema de su plantilla de etiquetas, podría crear una aplicación llamada 'common_tags'. Luego de configuración de ajustes de la INSTALLED_APPS lo usen, y usted será capaz de cargar sus etiquetas comunes de todas las plantillas de este modo:

{% load XXXX %} 
9

Desde Django 1.9, que ya no es necesario para crear common aplicación adicional como otros mencionados . Todo lo que necesita hacer es agregar una ruta a su proyecto templatetags al settings.pyOPTION['libraries'] dict.

Después de eso, estas etiquetas estarán accesibles durante todo el proyecto. La carpeta templatetags se puede colocar donde lo necesite y también puede tener un nombre diferente.

ejemplo personalizada desde el Django docs:

OPTIONS={ 
    'libraries': { 
     'myapp_tags': 'path.to.myapp.tags', 
     'project_tags': 'project.templatetags.common_extras', 
     'admin.urls': 'django.contrib.admin.templatetags.admin_urls', 
    }, 
} 
+1

Para hacerlo más claro, en la plantilla html donde se llama esta etiqueta, uno necesita '{% load project_tags%}' primero antes de llamar a la etiqueta normalmente usando '{% common_extras%}'. – h4k1m

Cuestiones relacionadas