Qual è la posizione migliore per inserire i modelli nel progetto django?
Risposte:
Dal libro Django, capitolo 4 :
Se non riesci a pensare a un posto ovvio dove mettere i tuoi modelli, ti consigliamo di creare una directory dei modelli all'interno del tuo progetto Django (cioè, all'interno della directory mysite che hai creato nel Capitolo 2, se hai seguito i nostri esempi).
Questo è esattamente quello che faccio e ha funzionato benissimo per me.
La struttura della mia directory è simile a questa:
/mediaper tutti i miei CSS / JS / immagini ecc.
/templatesper i miei modelli
/projectnameper il codice del progetto principale (cioè il codice Python)
Inserito <PROJECT>/<APP>/templates/<APP>/template.htmlper modelli specifici per app per aiutare a rendere l'app riutilizzabile altrove.
Per i modelli generali "globali" li inserisco <PROJECT>/templates/template.html
<APP>s <PROJECT>/<APP>/templates/<APP>/template.html?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRSora è deprecato - dovresti invece aggiungere DIRS=[os.path.join(BASE_DIR, "templates")]a TEMPLATES- vedi stackoverflow.com/questions/29725132/…
Seguendo Dominic e dlrust,
Usiamo una distribuzione del codice sorgente setuptools (sdist) per impacchettare il nostro progetto django e le app da distribuire nei nostri diversi ambienti.
Abbiamo scoperto che i modelli ei file statici devono trovarsi nelle directory dell'applicazione django in modo che possano essere impacchettati da setuptools.
Ad esempio, il nostro modello e i percorsi statici hanno il seguente aspetto:
PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
Perché funzioni, il MANIFEST.in deve essere modificato (vedi http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )
Un esempio di MANIFEST.in:
include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
Inoltre, devi confermare nel tuo file delle impostazioni di django che il caricatore di app_directories sia in TEMPLATE_LOADERS. Penso che sia presente di default in django 1.4.
Un esempio dei caricatori di modelli di impostazioni di django:
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
Nel caso ti stia chiedendo perché usiamo sdist invece di copiare semplicemente i file rsync; fa parte del nostro flusso di lavoro di gestione della configurazione in cui abbiamo un singolo tarball di build che viene distribuito con PIP invariato negli ambienti di test, accettazione e produzione.
/static/nel tuo piano di layout quando pensi a modelli e app modulari. Potresti citare un'altra best practice, mettere i cssfile in una cartella chiamata static/app/cssallo stesso modo per jse forse jpgo semplicemente /static/app/images.
DJANGO 1.11
aggiungi la cartella dei modelli in cui esiste il manage.py, che è la tua directory di base. cambia il DIRS per i MODELLI come segue nel tuo settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Ora per utilizzare il modello utilizzando il codice,
def home(request):
return render(request,"index.html",{})
in views.py. funziona perfettamente per django 1.11
Ho capito che TEMPLATE_DIRSrichiede un percorso assoluto. E non mi piacciono i percorsi assoluti nel mio codice. Quindi questo funziona bene per me, in settings.py:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
BASE_DIR, quindi puoi semplificarlo in:os.path.join(BASE_DIR, '../APPNAME/templates')
Django 1.10
TEMPLATE_DIRS è deprecato.
Ora dobbiamo usare TEMPLATE, introducendo in Django 1.8 in questo modo:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
Dopo aver definito TEMPLATES, puoi rimuovere in sicurezza ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS e TEMPLATE_STRING_IF_INVALID.
Riguardo alla posizione migliore, Django cerca un modello come questo:
Maggiori informazioni: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
La soluzione precedente non ha funzionato nel mio caso. Ero solito:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
TEMPLATE_DIRSora è deprecato.
BASE_DIR, in modo da poter semplificare questo a:os.path.join(BASE_DIR, '../myapp/templates')
Potresti anche considerare di avere i tuoi modelli in un database, usando django-dbtemplates . È anche configurato per la memorizzazione nella cache e l'applicazione django-reversion che ti aiuta a mantenere le vecchie versioni dei tuoi modelli in giro.
Funziona abbastanza bene, ma preferirei un po 'più di flessibilità sul lato di importazione / sincronizzazione da / verso il filesystem.
[modifica: 20 agosto 2018 - questo repository non è disponibile, uno con lo stesso nome è disponibile su https://github.com/jazzband/django-dbtemplates ed è stato aggiornato 8 mesi fa. Non uso più Django in modo significativo, quindi non posso garantirlo.]