2012-04-30 10 views
6

Ho la seguente struttura di cartelle per i modelli sul mio django app:Guglielmo Tell Django per cercare sottocartelle modello di app

templates/ 
    app/ 
     model1/ 
     model1_form.html 
     model2/ 
     model2_form.html 

Supponiamo che sto usando model1 e un controllo ListView generica, in questo momento è la ricerca solo a modelli/app/model1_form.html. Posso comunque dire a Django che dovrebbe cercare anche l'app/sottocartelle? Non desidero impostare manualmente il nome e il percorso del modello (template_name="templates/app/model1/model1_form.html").

A settings.py ho:

import os.path 
BASE_PATH = os.path.dirname(os.path.dirname(__file__)) 
TEMPLATE_DIRS = (
    BASE_PATH+'/templates/', 
) 

Questa è la mia opinione:

class HousesListView(ListView): 
    model = House 
    context_object_name = "house_list" 

Grazie in anticipo!

risposta

19

è necessario aggiungere django.template.loaders.app_directories.Loader-TEMPLATE_LOADERS (se non è già).

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
) 

Quindi, cambiare la struttura delle cartelle in modo che si dispone di una cartella "template" nella directory app:

- <project_root> 
    - app 
     - templates 
      - model1 
      - model2 

O per namespace correttamente i modelli in modo che non si scontrano con altri nomi delle app accidentalmente:

- <project_root> 
    - app 
     - templates 
      - app 
       - model1 
       - model2 
+3

Controlla la risposta di Bob Vork per Django 1.8+ – horriblyUnpythonic

1

penso ad utilizzare i modelli di sottocartelle in genere hai a:

  1. dare manualmente il percorso del modello come subdir/template.html
    ad es. render_to_response ('sub/dir/template.html') o template_name = '...'

  2. Definire tutte le sottocartelle della TEMPLATE_DIRS
    es.

    TEMPLATE_DIRS = (
    BASE_PATH + '/ templates /',
    BASE_PATH + '/ templates/app',
    BASE_PATH + '/ templates/app/model1',
    )

    ma perché generici Visualizzazioni eccezione i modelli si trovano in nome_app/template.html, , dovresti spostare i tuoi modelli per aggiungere /path/to/templates/app/model1 ai tuoi TEMPLATE_DIRS e spostare i tuoi modelli su templates/your_app/model/your_app/model_template.html, il che è un po 'imbarazzante.

+0

Ho provato il numero 2, inserendo "templates/app/model1" al TEMPLATE_DIR ma questo effettua la ricerca di django in "templates/app/model1/app/model1_form.html". Cosa intendi con il numero 1? – Clash

+0

@Clash Hai fornito i percorsi assoluti, o relativi al tuo "template-root"? Con 1. Volevo chiamare i modelli con il percorso completo, che non volevi fare? – varesa

+0

cosa intendi con "model/template.html"? – Clash

18

le altre risposte erano corrette al momento, ma per chi viene in questo momento, questo è come questo viene fatto in Django 1.8+

Per impostazione predefinita, Django ora cerca nelle cartelle dell'app i modelli.Questo è indicato da 'APP_DIRS': True, nell'impostazione TEMPLATES in questo modo:

TEMPLATES = [ 
    { 
    ... 
    'DIRS': ['templates'], 
    'APP_DIRS': True, 
    ... 
    }, 
] 

Come le altre risposte indicano, si dovrebbe comunque utilizzare appname/templates/appname/model1_form.html per namespace modelli

(maggiori informazioni: https://docs.djangoproject.com/en/1.8/intro/tutorial03/#write-views-that-actually-do-something nella casella intitolata 'namespacing modello ')

Controllo finale: assicurarsi che l'app in uso sia nella tupla INSTALLED_APPS, poiché si trattava del problema riscontrato.

+0

Ben fatto. "assicurati che l'app che stai utilizzando sia nella tupla INSTALLED_APPS" – Private

0

Con Django 2.0, non è nemmeno necessario modificare nulla nella variabile TEMPLATES in settings.py. L'unico requisito è aggiungere appname.apps.AppnameConfig (ad esempio catalog.apps.CatalogConfig per un'app denominata "catalogo") nell'elenco INSTALLED_APPS, quindi django cercherà sotto appname/templates quando cerca i modelli.