Qual è il percorso che Django utilizza per individuare e caricare i modelli?


91

Sto seguendo questo tutorial su un ambiente Windows 7.

Il mio file di impostazioni ha questa definizione:

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

Ho ottenuto il base_templatedal modello admin/base_site.htmldalla directory dei modelli di amministrazione Django predefinita nel codice sorgente di Django stesso (django / contrib / admin / templates) in una sottodirectory admin della myappdirectory come indicato dal tutorial, ma non sembra avere effetto per qualche ragione.

Qualche idea su quale potrebbe essere il problema?

Risposte:


185

So che questo non è nel tutorial di Django, e vergogna per loro, ma è meglio impostare percorsi relativi per le tue variabili di percorso. Puoi configurarlo in questo modo:

import os.path

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

TEMPLATE_DIRS = [
    os.path.join(PROJECT_PATH, 'templates/'),
]

In questo modo puoi spostare il tuo progetto Django e le tue radici del percorso si aggiorneranno automaticamente. Ciò è utile durante la configurazione del server di produzione.

Secondo, c'è qualcosa di sospetto nel tuo percorso TEMPLATE_DIRS. Dovrebbe puntare alla radice della directory dei modelli. Inoltre, dovrebbe anche finire in un finale /.

Immagino solo che la .../admin/directory non sia la radice del tuo modello. Se si desidera comunque scrivere percorsi assoluti, rimuovere il riferimento alla directory dei modelli di amministrazione.

TEMPLATE_DIRS = [
    'C:/django-project/myapp/mytemplates/',
]

Detto questo, i caricatori di modelli per impostazione predefinita dovrebbero essere impostati per attraversare in modo ricorsivo le directory delle app per individuare i file di modello.

TEMPLATE_LOADERS = [
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    # 'django.template.loaders.eggs.load_template_source',
]

Non dovresti aver bisogno di copiare i modelli dell'amministratore a meno che tu non voglia specificamente sovrascrivere qualcosa.

Dovrai eseguire un syncdb se non lo hai ancora eseguito. Avrai anche bisogno di server staticamente i tuoi file multimediali se stai ospitando django tramite runserver.


1
grazie mille per aver rimosso "/ admin" alla fine del percorso relativo di TEMPLATE_DIRS.
shaytac

1
Questo suggerimento inserisce la directory dei modelli all'interno della cartella del progetto. Per una migliore organizzazione, ha più senso metterlo invece nella cartella di un'app?
Sahas Katta

2
Questo ha risolto il mio problema. Grazie. MA, il file delle impostazioni predefinite aveva un commento con TEMPLATE_DIRS che diceva: "Non dimenticare di utilizzare percorsi assoluti, non percorsi relativi". Qualcuno conosce la giustificazione di quel commento?
bhekman

1
PROJECT_PATH è il percorso assoluto della cartella del progetto. Questo metodo imposta dinamicamente il percorso multimediale assoluto in fase di esecuzione in modo che il valore non sia hardcoded e possa cambiare automaticamente con la posizione del progetto. Questo è un vecchio post ma puoi usarlo per definire la posizione di qualsiasi cartella o file nel progetto.
digitaldreamer

2
Suggerirei di utilizzare os.path.joinper aggiungere percorsi alla directory di base.
antonagestam

35

Se si utilizzano le impostazioni Django come installate, perché non utilizzare semplicemente i suoi BASE_DIR e TEMPLATES predefiniti e predefiniti? Nel pip installato Django (v1.8), ottengo:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            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',
            ],
        },
    },
]

1
questo «BASE_DIR + '/ templates /'», ha funzionato. E sembra molto più elegante, piuttosto che in una sezione separata.
Maxiller

2
utilizzare os.path.join(BASE_DIR, 'templates')per il percorso per essere indipendente dalla piattaforma.
Abhyudai

12

Soluzione intelligente in Django 2.0.3 per mantenere i modelli nella directory del progetto ( /root/templates/app_name):

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...

in views.py aggiungi semplicemente il percorso del modello:

app_name/html_name

9

Per Django 1.6.6:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')

Anche statico e multimediale per il debug e la modalità di produzione:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%

In urls.py devi aggiungere:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

In Django 1.8 puoi impostare percorsi dei modelli, backend e altri parametri per i modelli in un dizionario ( settings.py ):

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            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',
            ],
        },
    },
]

Documenti ufficiali.


Il percorso del modello deve essere una tupla: usa questo TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),)
renderbox

6

Ho anche avuto problemi con questa parte del tutorial (tutorial utilizzato per la versione 1.7).

Il mio errore è stato quello di modificare solo la stringa di "amministrazione Django" e di non prestare sufficiente attenzione al manuale.

Questa è la riga di django / contrib / admin / templates / admin / base_site.html :

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>

Ma dopo un po 'di tempo e di frustrazione è diventato chiaro che c'era l'istruzione "site_header o default: _", che doveva essere rimossa. Quindi, dopo aver rimosso l'istruzione (come nell'esempio nel manuale, tutto ha funzionato come previsto).

Manuale di esempio:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>

2

Va bene 😁 Diciamo che si dispone di un nuovo progetto, in tal caso si dovrebbe andare al settings.pyfile e cercare TEMPLATESuna volta trovato è semplicemente incollare questa linea os.path.join(BASE_DIR, 'template')nel 'DIRS'Alla fine, si dovrebbe ottenere quarantina come questo:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        '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',
            ],
        },
    },
]

Se vuoi sapere dove si trova la tua directory BASE_DIR digita questi 3 semplici comandi:

python3 manage.py shell

Una volta che sei nella shell:

>>> from django.conf import settings
>>> settings.BASE_DIR

PS: se hai chiamato la cartella dei modelli con un altro nome, lo cambierai anche qui.


2

In django 3.1, vai alle impostazioni del tuo progetto e importa os

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',
            ],
        },
    },
]

1

In django 2.2 questo è spiegato qui

https://docs.djangoproject.com/en/2.2/howto/overriding-templates/

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

INSTALLED_APPS = [
    ...,
    'blog',
    ...,
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]

1

Contrariamente ad alcune risposte pubblicate in questo thread, l'aggiunta 'DIRS': ['templates']non ha alcun effetto (è ridondante) poiché templatesè il percorso predefinito in cui Django cerca i modelli.

Se stai tentando di fare riferimento al modello di un'app, assicurati che la tua app sia nell'elenco di INSTALLED_APPSnel progetto principale settings.py.

INSTALLED_APPS': [
   # ...
   'my_app',
]

Citando la documentazione dei modelli di Django :

class DjangoTemplates¶

Imposta BACKEND su "django.template.backends.django.DjangoTemplates" per configurare un motore di modelli Django.

Quando APP_DIRS è True, i motori DjangoTemplates cercano i modelli nella sottodirectory dei modelli delle applicazioni installate. Questo nome generico è stato mantenuto per compatibilità con le versioni precedenti.

Quando crei un'applicazione per il tuo progetto, non c'è alcuna templatesdirectory all'interno della directory dell'applicazione. Dato che puoi avere un'applicazione senza usare i modelli, Django non crea tale directory. Cioè, devi crearlo e memorizzare i tuoi modelli lì.

Ecco un altro paragrafo dalla documentazione del Django Tutorial , che è ancora più chiaro:

L'impostazione TEMPLATES del tuo progetto descrive come Django caricherà e renderà i modelli. Il file delle impostazioni predefinite configura un backend DjangoTemplates la cui opzione APP_DIRS è impostata su True. Per convenzione DjangoTemplates cerca una sottodirectory "templates" in ciascuna delle INSTALLED_APPS.


1
Ben detto. Vale la pena citare la documentazione dei modelli e ciò che dice riguardo alla templatesdirectory.
ivanleoncz

0

fondamentalmente BASE_DIRè la directory del progetto django, la stessa directory in cui si manage.pytrova.

    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',
                ],
            },
        },
    ]

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.