Wiem, że tego nie ma w samouczku Django i szkoda ich, ale lepiej ustawić względne ścieżki dla zmiennych ścieżek. Możesz to skonfigurować w następujący sposób:
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/'),
]
W ten sposób możesz przenieść projekt Django, a korzenie ścieżki zostaną automatycznie zaktualizowane. Jest to przydatne podczas konfigurowania serwera produkcyjnego.
Po drugie, na Twojej ścieżce TEMPLATE_DIRS jest coś podejrzanego. Powinien wskazywać na katalog główny twojego katalogu szablonów. Powinien również kończyć się końcem /
.
Zgadnę tutaj, że .../admin/
katalog nie jest katalogiem głównym szablonu. Jeśli nadal chcesz pisać bezwzględne ścieżki, powinieneś usunąć odniesienie do katalogu szablonów administratora.
TEMPLATE_DIRS = [
'C:/django-project/myapp/mytemplates/',
]
Mając to na uwadze, programy ładujące szablony powinny być domyślnie skonfigurowane do rekurencyjnego przechodzenia do katalogów aplikacji w celu zlokalizowania plików szablonów.
TEMPLATE_LOADERS = [
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
]
Nie musisz kopiować szablonów administratora, chyba że chcesz coś nadpisać.
Będziesz musiał uruchomić syncdb, jeśli jeszcze go nie uruchomiłeś. Będziesz także musiał statycznie serwować swoje pliki multimedialne, jeśli hostujesz django za pośrednictwem serwera uruchomieniowego.
os.path.join
do dołączenia ścieżek do katalogu podstawowego.Jeśli używasz zainstalowanych ustawień Django, to dlaczego nie użyć jego gotowych, predefiniowanych BASE_DIR i TEMPLATES? W pip zainstalowanym Django (v1.8) otrzymuję:
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', ], }, }, ]
źródło
os.path.join(BASE_DIR, 'templates')
aby ścieżka była niezależna od platformy.Inteligentne rozwiązanie w Django 2.0.3 do przechowywania szablonów w katalogu projektu (
/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], ...
w views.py po prostu dodaj taką ścieżkę do szablonu:
źródło
Dla Django 1.6.6:
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')
Również statyczne i multimedialne do debugowania i trybu produkcyjnego:
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%
Do urls.py musisz dodać:
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)
W Django 1.8 możesz ustawić ścieżki szablonów, zaplecze i inne parametry szablonów w jednym słowniku ( 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', ], }, }, ]
Oficjalne dokumenty.
źródło
Miałem też problemy z tą częścią samouczka (użyłem samouczka w wersji 1.7).
Mój błąd polegał na tym, że zredagowałem tylko ciąg „Django administracja” i nie zwróciłem wystarczającej uwagi na podręcznik.
To jest linia z django / contrib / admin / templates / admin / base_site.html :
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
Ale po pewnym czasie i frustracji stało się jasne, że istnieje instrukcja „site_header lub default: _”, którą należy usunąć. Czyli po usunięciu instrukcji (podobnie jak w przykładzie w instrukcji wszystko działało zgodnie z oczekiwaniami).
Przykładowa instrukcja:
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
źródło
Dobrze 😁 powiedzmy masz nowy projekt, jeśli tak chcesz przejść do
settings.py
pliku i sprawdzićTEMPLATES
raz okazało się, że po prostu wkleić ten wierszos.path.join(BASE_DIR, 'template')
w'DIRS'
Na koniec, należy uzyskać latków jak to: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', ], }, }, ]
Jeśli chcesz wiedzieć, gdzie znajduje się katalog BASE_DIR, wpisz te 3 proste polecenia:
Gdy znajdziesz się w powłoce:
>>> from django.conf import settings >>> settings.BASE_DIR
PS: Jeśli nazwałeś folder szablonów inną nazwą, możesz to również zmienić tutaj.
źródło
W django 3.1 przejdź do ustawień projektu i zaimportuj system operacyjny
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', ], }, }, ]
źródło
W django 2.2 jest to wyjaśnione tutaj
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, ... }, ]
źródło
w zasadzie
BASE_DIR
to katalog twojego projektu django, ten sam katalog, gdziemanage.py
jest.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', ], }, }, ]
źródło
W przeciwieństwie do niektórych odpowiedzi zamieszczonych w tym wątku, dodawanie
'DIRS': ['templates']
nie przynosi żadnego efektu, ponieważ „szablony” to domyślna ścieżka, w której Django szuka szablonów.Jeśli próbujesz odwołać się do szablonu aplikacji, upewnij się, że aplikacja znajduje się na liście
INSTALLED_APPS
w głównym projekciesettings.py
.INSTALLED_APPS': [ # ... 'my_app', ]
źródło