W jakiej lokalizacji najlepiej umieścić szablony w projekcie django?


88

W jakiej lokalizacji najlepiej umieścić szablony w projekcie django?

Odpowiedzi:


50

Z książki Django, rozdział 4 :

Jeśli nie możesz wymyślić oczywistego miejsca na umieszczenie szablonów, zalecamy utworzenie katalogu szablonów w projekcie Django (tj. W katalogu mysite utworzonym w rozdziale 2, jeśli śledziłeś nasze przykłady).

To jest dokładnie to, co robię i świetnie się dla mnie sprawdza.

Moja struktura katalogów wygląda mniej więcej tak:

/mediadla wszystkich moich obrazów CSS / JS / itp.
/templatesdla moich szablonów
/projectnamedla głównego kodu projektu (tj. kodu Pythona)


1
kiedy umieszczasz szablony w / templates, czy istnieje sposób, aby powiedzieć programowi ładującemu szablonów, aby załadował go bez określania pełnej ścieżki do / template w TEMPLATE_DIRS w celu załadowania za pomocą django.template.loaders.filesystem.Loader? Byłoby wspaniale zrobić to ze ścieżką względną, a pod 1.4 mój program ładujący nie szuka pod <project> / templates
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

87

Umieszczane w <PROJECT>/<APP>/templates/<APP>/template.htmlszablonach specyficznych dla aplikacji, aby ułatwić ponowne wykorzystanie aplikacji w innym miejscu.

Umieszczam je w ogólnych szablonach „globalnych” <PROJECT>/templates/template.html


11
Zastanawiasz przyczynę 2 <APP>sw <PROJECT>/<APP>/templates/<APP>/template.html?
David Xia

18
Pierwsza / app / templates służy tylko do grupowania szablonów z odpowiednią aplikacją. Druga aplikacja służy do zapobiegania kolizjom nazw. (Przypuszczalnie wskażesz TEMPLATE_DIRS, aby wskazywał na każdy z tych katalogów, ale ostatecznie Django łączy je w jeden gigantyczny katalog.) Zobacz: docs.djangoproject.com/en/dev/ref/templates/api/ ...
Ceasar Bautista

3
Aby to zadziałało (django 1.6), musiałem dodać dyrektywę do modułu ładującego szablony systemu plików:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman

3
Ta odpowiedź jest stara, ale jakoś tu trafiłem. Dla przypomnienia, TEMPLATE_DIRSjest teraz przestarzałe - zamiast tego należy dodać DIRS=[os.path.join(BASE_DIR, "templates")]do TEMPLATES- patrz stackoverflow.com/questions/29725132/...
John Aaron

9

Idąc za Dominikiem i Dlrustem,

Używamy dystrybucji źródła setuptools (sdist), aby spakować nasz projekt django i aplikacje do wdrożenia w naszych różnych środowiskach.

Odkryliśmy, że szablony i pliki statyczne muszą znajdować się w katalogach aplikacji django, aby mogły być pakowane przez setuptools.

Na przykład nasz szablon i ścieżki statyczne wyglądają następująco:

PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js

Aby to zadziałało, MANIFEST.in musi zostać zmodyfikowany (patrz http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )

Przykład MANIFESTU.in:

include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg

Ponadto musisz potwierdzić w pliku ustawień django, że program ładujący app_directories znajduje się w TEMPLATE_LOADERS. Myślę, że jest tam domyślnie w django 1.4.

Przykład programów ładujących szablony ustawień 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',
)

Na wypadek gdybyś się zastanawiał, dlaczego używamy sdists zamiast tylko radzić sobie z plikami rsync; jest to część naszego przepływu pracy zarządzania konfiguracją, w którym mamy jedno paczkę kompilacji, która jest wdrażana z niezmienionym PIP w środowiskach testowych, akceptacyjnych i produkcyjnych.


1
+1 Dziękujemy za podanie dodatkowych szczegółów i przykładowych wierszy.
gotgenes

+1 inteligentnie do uwzględnienia /static/w planie układu, gdy myślisz o szablonach i aplikacjach modułowych. Możesz wspomnieć o innej najlepszej praktyce, umieszczaniu cssplików w folderze o static/app/csspodobnej nazwie dla jsi może jpglub tylko /static/app/images.
płyty grzewcze

7

DJANGO 1.11

dodaj folder szablonów, w którym istnieje manage.py, czyli katalog podstawowy. zmień DIRS dla SZABLONÓW w następujący sposób w twoim 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',
        ],
    },
},

]

Teraz, aby użyć szablonu za pomocą kodu,

def home(request):
    return render(request,"index.html",{})

w views.py. działa to całkowicie dobrze dla django 1.11


1

To jest bardziej osobisty wybór na poziomie projektu. Jeśli mówisz o aplikacjach, które muszą być podłączane, katalog szablonów w Twojej aplikacji jest miejscem, w którym są one domyślne. Ale w przypadku całego projektu to właśnie działa najlepiej.


1

Zrozumiałem, że TEMPLATE_DIRSwymaga absolutnej ścieżki. I nie lubię absolutnych ścieżek w moim kodzie. Więc to działa dobrze dla mnie, w settings.py:

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(os.path.realpath(__file__)),
                 "../APPNAME/templates")
)

1
Projekty Django mają już zdefiniowaną ścieżkę bazową w standardowym BASE_DIRos.path.join(BASE_DIR, '../APPNAME/templates')
pliku

1

Django 1.10.0

TEMPLATE_DIRS jest przestarzałe.

Teraz musimy użyć TEMPLATE, wprowadzając w Django 1.8 w następujący sposób:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

Po zdefiniowaniu TEMPLATES możesz bezpiecznie usunąć ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS i TEMPLATE_STRING_IF_INVALID.

O najlepszej lokalizacji, Django szuka takiego szablonu:

  • DIRS definiuje listę katalogów, w których silnik powinien szukać plików źródłowych szablonów w kolejności wyszukiwania.
  • APP_DIRS mówi, czy silnik powinien szukać szablonów w zainstalowanych aplikacjach. Każdy backend definiuje konwencjonalną nazwę dla podkatalogu wewnątrz aplikacji, w którym powinny być przechowywane jego szablony.

Więcej informacji: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration


0

Poprzednie rozwiązanie nie zadziałało w moim przypadku. Użyłem:

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]

Spójrz na moją odpowiedź. TEMPLATE_DIRSjest teraz przestarzała.
Wilfried,

Projekty Django mają już zdefiniowaną ścieżkę bazową w standardowym BASE_DIRos.path.join(BASE_DIR, '../myapp/templates')
pliku

0

Możesz również rozważyć umieszczenie szablonów w bazie danych, używając django-dbtemplates . Jest również skonfigurowany do buforowania i aplikacja django-reversion, która pomaga zachować stare wersje szablonów.

Działa całkiem dobrze, ale wolałbym trochę więcej elastyczności po stronie importu / synchronizacji do / z systemu plików.

[edycja: 20 sierpnia 2018 - to repozytorium nie jest dostępne, jedno o tej samej nazwie jest dostępne pod adresem https://github.com/jazzband/django-dbtemplates i zostało zaktualizowane 8 miesięcy temu. Nie używam już Django w żaden znaczący sposób, więc nie mogę za to ręczyć.]


Kiedy to byłby dobry pomysł? Czy nie jest wolniejsze ładowanie szablonów z bazy danych?
jguffey

Czy nie uzależniasz się od db, jeśli przechowujesz szablony w db, a ponadto czy uczysz swoją bazę danych częścią zatwierdzeń git? W jaki sposób będziesz koordynować zmiany wprowadzone przez różnych użytkowników w szablonach?
gautamaggarwal

Zostało to napisane na długo, zanim zdałem sobie sprawę z gita. Nie jestem nawet pewien, czy używałem wtedy svn. Poleciłbym teraz używać systemów kontroli wersji.
TonyM,

@tonemcd, to repozytorium zostało usunięte.
lmiguelvargasf
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.