W jakiej lokalizacji najlepiej umieścić szablony w projekcie django?
Odpowiedzi:
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
<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")]
do TEMPLATES
- 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.
/static/
w planie układu, gdy myślisz o szablonach i aplikacjach modułowych. Możesz wspomnieć o innej najlepszej praktyce, umieszczaniu css
plików w folderze o static/app/css
podobnej nazwie dla js
i może jpg
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
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, w settings.py
:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
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 ...
},
},
]
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:
Więcej informacji: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
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") ]
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ć.]