Qual è la posizione migliore per inserire i modelli nel progetto django?


88

Qual è la posizione migliore per inserire i modelli nel progetto django?

Risposte:


50

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)


1
quando metti i template in / templates, c'è un modo per dire al template loader di caricarlo senza specificare il percorso completo di / template in TEMPLATE_DIRS da caricare con django.template.loaders.filesystem.Loader? Sarebbe bello farlo con un percorso relativo, e sotto 1.4 il mio caricatore non guarda sotto <progetto> / templates
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

87

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


11
Ti stai chiedendo il motivo per 2 <APP>s <PROJECT>/<APP>/templates/<APP>/template.html?
David Xia

18
Il primo / app / templates serve solo per raggruppare i modelli con la loro app pertinente. La seconda app serve a prevenire le collisioni di nomi. (Presumibilmente, indicherai TEMPLATE_DIRS in modo che punti a ciascuna di queste directory, ma alla fine Django le raggruppa in un'unica directory gigante.) Vedi: docs.djangoproject.com/en/dev/ref/templates/api/…
Cesare Bautista

3
Affinché funzioni (django 1.6), ho dovuto aggiungere la direttiva per il caricatore di modelli di file system:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman

3
Questa risposta è antica, ma in qualche modo sono finito qui. Per la cronaca, TEMPLATE_DIRSora è deprecato - dovresti invece aggiungere DIRS=[os.path.join(BASE_DIR, "templates")]a TEMPLATES- vedi stackoverflow.com/questions/29725132/…
John Aaron

9

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.


1
+1 Grazie per aver fornito dettagli aggiuntivi e righe di esempio.
gotgenes

+1 intelligente da includere /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.
piani cottura

7

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


1

Questa è più una scelta personale a livello di progetto. Se stai parlando di app che devono essere collegabili, una directory di modelli nella tua app è il luogo in cui diventano predefinite. Ma a livello di progetto, è ciò che funziona meglio per te.


1

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")
)

1
I progetti Django hanno il loro percorso di base definito già in standard settings.py come BASE_DIR, quindi puoi semplificarlo in:os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue

1

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:

  • DIRS definisce un elenco di directory in cui il motore deve cercare i file di origine del modello, in ordine di ricerca.
  • APP_DIRS indica se il motore deve cercare modelli all'interno delle applicazioni installate. Ogni backend definisce un nome convenzionale per la sottodirectory all'interno delle applicazioni in cui devono essere memorizzati i suoi modelli.

Maggiori informazioni: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration


0

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") ]

Guarda la mia risposta. TEMPLATE_DIRSora è deprecato.
Wilfried

Progetti Django hanno il loro percorso di base definita già nel settings.py standard BASE_DIR, in modo da poter semplificare questo a:os.path.join(BASE_DIR, '../myapp/templates')
ngoue

0

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.]


Quando sarebbe una buona idea? Non è più lento caricare i modelli dal DB?
jguffey

Non diventi dipendente da db se archivi i modelli in db plus renderai il tuo db parte dei commit di git? Come coordinerai le modifiche apportate dai diversi utenti nei modelli?
gautamaggarwal

Questo è stato scritto molto prima che venissi a conoscenza di git. Non sono nemmeno sicuro che stessi usando svn in quel momento. Consiglierei di utilizzare i sistemi di controllo della versione ora.
TonyM

@tonemcd, questo repository è stato eliminato.
lmiguelvargasf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.