2009-05-21 7 views
25

seconda volta chiedendo maggiori dettagli ...Django - Come avere un progetto di ampio templatetags condivisi tra tutte le mie applicazioni in quel progetto

mi piacerebbe avere una directory di larghezza templagetags progetto di avere i comuni tag utilizzato da tutte le app, quindi ogni app può avere i propri tag se necessario.

Let dire che ho:

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 

Dove:

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" %} 

Sarebbe questo lavoro? Non ha funzionato per me. Non riesce a trovare i proj1_tags da caricare.

risposta

36

Non so se questo è il giusto modo per farlo, ma nei miei applicazioni Django, ho sempre posto tag template comuni in una "app" lib, in questo modo:

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

Assicurati di aggiungere l'app lib al tuo elenco di INSTALLED_APPS in settings.py.

+2

solito denominare l'applicazione dopo il progetto: "project_core" - ma stessa soluzione. –

+3

'common' o' commons' potrebbe essere anche un buon nome. –

+0

come si chiama in file html? Giusto '{% load common_tags%}'? – andi

3

Django registra templatetags a livello globale per ogni applicazione in INSTALLED_APPS (e questo è il motivo per cui la soluzione non funziona: progetto non è un applicazione come è intesa da Django) — sono disponibili in tutti i modelli (a condizione che è stata correttamente registrati).

Di solito ho un'app che gestisce la funzionalità varie (come la pagina iniziale del sito) e inserisce templatetags non correlate a nessuna app particolare, ma questo è puramente estetico.

0

Django funziona da App. Si riferiscono nell'impostazione INSTALLED_APPS.

Ti suggerisco di dividere tutto ciò che riguarda un'app diversa. Per il tuo problema templatetags, potresti creare un'app chiamata "common_tags". Poi configurazione delle impostazioni INSTALLED_APPS di usarlo, e sarete in grado di caricare i tag comuni da tutti i modelli in questo modo:

{% load XXXX %} 
9

Dal Django 1.9, non è più necessario creare ulteriore common app come gli altri citati . Tutto quello che devi fare è aggiungere un percorso alla directory del tuo progetto templatetags allo OPTION['libraries'] .

Dopodiché, questi tag saranno accessibili durante l'intero progetto. La cartella templatetags può essere posizionata ovunque sia necessario e può anche avere un nome diverso.

esempio personalizzata dal 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

Giusto per rendere più chiaro, nel template html in cui viene chiamato questo tag è necessario "{% load project_tags%}" prima di chiamare normalmente il tag usando "{% common_extras%}". – h4k1m

Problemi correlati