W jakiej lokalizacji najlepiej umieścić szablony w projekcie django?
88
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:
/media
dla wszystkich moich obrazów CSS / JS / itp.
/templates
dla moich szablonów
/projectname
dla głównego kodu projektu (tj. kodu Pythona)
Umieszczane w
<PROJECT>/<APP>/templates/<APP>/template.html
szablonach specyficznych dla aplikacji, aby ułatwić ponowne wykorzystanie aplikacji w innym miejscu.Umieszczam je w ogólnych szablonach „globalnych”
<PROJECT>/templates/template.html
źródło
<APP>
sw<PROJECT>/<APP>/templates/<APP>/template.html
?TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRS
jest teraz przestarzałe - zamiast tego należy dodaćDIRS=[os.path.join(BASE_DIR, "templates")]
doTEMPLATES
- patrz stackoverflow.com/questions/29725132/...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.
źródło
/static/
w planie układu, gdy myślisz o szablonach i aplikacjach modułowych. Możesz wspomnieć o innej najlepszej praktyce, umieszczaniucss
plików w folderze ostatic/app/css
podobnej nazwie dlajs
i możejpg
lub tylko/static/app/images
.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
źródło
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.
źródło
Zrozumiałem, że
TEMPLATE_DIRS
wymaga absolutnej ścieżki. I nie lubię absolutnych ścieżek w moim kodzie. Więc to działa dobrze dla mnie, wsettings.py
:import os TEMPLATE_DIRS = ( os.path.join(os.path.dirname(os.path.realpath(__file__)), "../APPNAME/templates") )
źródło
BASE_DIR
os.path.join(BASE_DIR, '../APPNAME/templates')
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 ... }, }, ]
O najlepszej lokalizacji, Django szuka takiego szablonu:
Więcej informacji: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
źródło
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") ]
źródło
TEMPLATE_DIRS
jest teraz przestarzała.BASE_DIR
os.path.join(BASE_DIR, '../myapp/templates')
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ć.]
źródło