Django projesine şablon koymak için en iyi konum nedir?
Yanıtlar:
Django kitabından bölüm 4 :
Şablonlarınızı yerleştirmek için bariz bir yer düşünemiyorsanız, Django projenizde bir şablonlar dizini oluşturmanızı öneririz (yani, örneklerimizle birlikte takip ediyorsanız, Bölüm 2'de oluşturduğunuz mysite dizini içinde).
Bu tam olarak yaptığım şey ve benim için harika çalıştı.
Dizin yapım şuna benzer:
/media
tüm CSS / JS / resimlerim vb.
/templates
için
/projectname
ana proje kodu (yani Python kodu) için şablonlarım
<PROJECT>/<APP>/templates/<APP>/template.html
Uygulamayı başka yerlerde yeniden kullanılabilir hale getirmeye yardımcı olmak için uygulamaya özel şablonlar için yerleştirilir .
Genel "global" şablonlar için onları <PROJECT>/templates/template.html
<APP>
ler in <PROJECT>/<APP>/templates/<APP>/template.html
?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRS
artık önerilmemektedir - bunun yerine eklemek gerekir DIRS=[os.path.join(BASE_DIR, "templates")]
için TEMPLATES
- bkz stackoverflow.com/questions/29725132/...
Dominic ve Dlrust'tan sonra,
Django projemizi ve uygulamalarımızı farklı ortamlarımızda dağıtmak üzere paketlemek için bir setuptools kaynak dağıtımı (sdist) kullanıyoruz.
Kurulum araçları tarafından paketlenebilmeleri için şablonların ve statik dosyaların django uygulama dizinleri altında olması gerektiğini bulduk.
Örneğin, şablonumuz ve statik yollarımız şuna benzer:
PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
Bunun çalışması için MANIFEST.in değiştirilmelidir (bkz. Http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )
MANIFEST.in'e bir örnek:
include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
Ayrıca django ayarları dosyanızda app_directories yükleyicisinin TEMPLATE_LOADERS'ınızda olduğunu doğrulamanız gerekir . Sanırım django 1.4'te varsayılan olarak orada.
Django ayarları şablon yükleyicilerine bir örnek:
# 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',
)
Sadece rsync dosyalarıyla uğraşmak yerine neden sdist kullandığımızı merak ediyorsanız; PIP ile değiştirilmeden test, kabul ve üretim ortamlarına dağıtılan tek bir derleme tarball'umuzun olduğu konfigürasyon yönetimi iş akışımızın bir parçasıdır.
/static/
Şablonlar ve modüler uygulamalar hakkında düşünürken düzen planınıza dahil etmek için akıllı +1 . Başka bir en iyi uygulamadan bahsetmek isteyebilirsiniz, css
dosyaları static/app/css
aynı şekilde js
ve belki jpg
veya sadece adlı bir klasöre koymak /static/app/images
.
DJANGO 1.11
ana dizininiz olan manage.py dosyasının bulunduğu yere şablonlar klasörü ekleyin. ŞABLONLAR için DIRS'ı ayarlarınızda aşağıdaki gibi değiştirin.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',
],
},
},
]
Şimdi kodu kullanarak şablonu kullanmak için,
def home(request):
return render(request,"index.html",{})
views.py içinde. bu django 1.11 için tamamen iyi çalışıyor
Bu, proje düzeyinde daha kişisel bir seçimdir. Takılabilir olması gereken uygulamalardan bahsediyorsanız, uygulamanızdaki bir şablonlar dizini varsayılan olarak gittikleri yerdir. Ancak proje genelinde sizin için en uygun olan budur.
TEMPLATE_DIRS
Mutlak bir yol gerektirdiğini anladım . Ve kodumdaki mutlak yolları sevmiyorum. Bu benim için iyi çalışıyor settings.py
:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
BASE_DIR
, bu nedenle bunu şu şekilde basitleştirebilirsiniz:os.path.join(BASE_DIR, '../APPNAME/templates')
Django 1.10
TEMPLATE_DIRS
kullanımdan kaldırıldı.
Şimdi kullanımına gerek TEMPLATE
, Django 1.8 içinde tanıtan böyle:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
ŞABLONLARI tanımladıktan sonra, ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS ve TEMPLATE_STRING_IF_INVALID’i güvenle kaldırabilirsiniz.
En iyi konum hakkında, Django bunun gibi bir şablon arıyor:
Daha fazla bilgi: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
Benim durumumda önceki çözüm işe yaramadı. Kullandım:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
TEMPLATE_DIRS
şimdi kullanımdan kaldırıldı.
BASE_DIR
, bu nedenle bunu şu şekilde basitleştirebilirsiniz:os.path.join(BASE_DIR, '../myapp/templates')
Şablonlarınızı django-dbtemplates kullanarak bir veritabanında bulundurmayı da düşünebilirsiniz. . Ayrıca, önbelleğe alma için ayarlanmıştır ve şablonlarınızın eski sürümlerini korumanıza yardımcı olan django-reversion uygulamasıdır.
Oldukça iyi çalışıyor, ancak dosya sistemine / sistemden içe aktarma / eşitleme tarafında biraz daha fazla esneklik tercih ederim.
[düzenleme: 20 Ağu 2018 - bu depo mevcut değil, aynı adı taşıyan bir depo https://github.com/jazzband/django-dbtemplates adresinde mevcut ve 8 ay önce güncellendi. Artık Django'yu anlamlı bir şekilde kullanmıyorum, bu yüzden bunun için kefil olamam.]