Ścieżka do szablonu Django


90

Śledzę samouczek dotyczący http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 w środowisku Windows 7. Mój plik ustawień to:

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

Mam plik base_templatez szablonu admin/base_site.htmlz domyślnego katalogu szablonów administratora Django w kodzie źródłowym samego Django (django / contrib / admin / templates) do podkatalogu administratora katalogu myapp, zgodnie z instrukcją w samouczku.

Z jakiegoś powodu nie wydaje się to mieć wpływu. Masz jakąś wskazówkę, co może być problemem? Czy muszę wykonać synchronizację bazy danych?

Odpowiedzi:


183

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',
    # 'django.template.loaders.eggs.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.


1
dzięki bardzo usunięciu "/ admin" na końcu ścieżki względnej TEMPLATE_DIRS zrobiło to.
shaytac

1
Ta sugestia powoduje umieszczenie katalogu szablonów w folderze projektu. Czy dla lepszej organizacji lepiej jest umieścić go w folderze aplikacji?
Sahas Katta

2
To rozwiązało mój problem. Dzięki. ALE, domyślny plik ustawień miał komentarz z TEMPLATE_DIRS mówiący: „Nie zapomnij użyć ścieżek bezwzględnych, a nie ścieżek względnych”. Czy ktoś zna uzasadnienie tego komentarza?
bhekman

1
PROJECT_PATH to bezwzględna ścieżka do folderu projektu. Ta metoda ustawia bezwzględną ścieżkę multimediów dynamicznie w czasie wykonywania, więc wartość nie jest zakodowana na stałe i może zmieniać się automatycznie wraz z lokalizacją projektu. To jest stary post, ale możesz go użyć do zdefiniowania lokalizacji dowolnego folderu lub pliku w projekcie.
digitaldreamer

2
Sugerowałbym użycie os.path.joindo dołączenia ścieżek do katalogu podstawowego.
antonagestam

34

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

1
ten «BASE_DIR + '/ templates /',» załatwił sprawę. I wygląda o wiele bardziej elegancko niż osobna sekcja.
Maxiller

2
użyj, os.path.join(BASE_DIR, 'templates')aby ścieżka była niezależna od platformy.
Abhyudai

11

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:

app_name/html_name

9

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.


Ścieżka szablonu musi być krotką: użyj tego TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),)
renderbox

6

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>

2

Dobrze 😁 powiedzmy masz nowy projekt, jeśli tak chcesz przejść do settings.pypliku i sprawdzić TEMPLATESraz okazało się, że po prostu wkleić ten wiersz os.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:

python3 manage.py shell

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.


2

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


0

w zasadzie BASE_DIRto katalog twojego projektu django, ten sam katalog, gdzie manage.pyjest.

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


0

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_APPSw głównym projekcie settings.py.

INSTALLED_APPS': [
   # ...
   'my_app',
]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.