Django projesine şablon koymak için en iyi konum nedir?


90

Django projesine şablon koymak için en iyi konum nedir?

Yanıtlar:


50

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:

/mediatüm CSS / JS / resimlerim vb.
/templatesiçin
/projectnameana proje kodu (yani Python kodu) için şablonlarım


1
şablonları / templates içine koyduğunuzda, şablon yükleyiciye, django.template.loaders.filesystem.Loader ile yüklenecek TEMPLATE_DIRS içindeki / şablonun tam yolunu belirtmeden onu yüklemesini söylemenin bir yolu var mı? Bunu göreceli bir yolla yapmak harika olurdu ve 1.4'ün altında yükleyicim <project> / templates
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

89

<PROJECT>/<APP>/templates/<APP>/template.htmlUygulamayı 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


11
2'nin nedenini merak <APP>ler in <PROJECT>/<APP>/templates/<APP>/template.html?
David Xia

18
İlk / uygulama / şablonlar, şablonları ilgili uygulamalarıyla gruplamak içindir. İkinci uygulama, ad çakışmalarını önlemektir. (Muhtemelen TEMPLATE_DIRS'i bu dizinlerin her birine işaret edecek şekilde göstereceksiniz, ancak sonunda, Django onları tek bir dev dizinde toplar
Ceasar Bautista

3
Bunun çalışması için (django 1.6), dosya sistemi şablon yükleyicisine yönerge TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
eklemem gerekiyordu

3
Bu cevap çok eski, ama bir şekilde buraya geldim. Kayıt için, TEMPLATE_DIRSartık önerilmemektedir - bunun yerine eklemek gerekir DIRS=[os.path.join(BASE_DIR, "templates")]için TEMPLATES- bkz stackoverflow.com/questions/29725132/...
John Aaron

9

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.


1
+1 Ekstra ayrıntı ve örnek satırlar sağladığınız için teşekkür ederiz.
gotgenes

/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, cssdosyaları static/app/cssaynı şekilde jsve belki jpgveya sadece adlı bir klasöre koymak /static/app/images.
Ocak

8

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


1

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.


1

TEMPLATE_DIRSMutlak 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")
)

1
Django projelerinin temel yolları zaten standart settings.py olarak tanımlanmıştır BASE_DIR, bu nedenle bunu şu şekilde basitleştirebilirsiniz:os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue

1

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:

  • DIRS , arama sırasına göre motorun şablon kaynak dosyalarını araması gereken dizinlerin bir listesini tanımlar.
  • APP_DIRS , motorun yüklü uygulamaların içindeki şablonları arayıp aramayacağını söyler. Her arka uç, şablonlarının depolanması gereken uygulamaların içindeki alt dizin için geleneksel bir ad tanımlar.

Daha fazla bilgi: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration


0

Benim durumumda önceki çözüm işe yaramadı. Kullandım:

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

Cevabıma bak. TEMPLATE_DIRSşimdi kullanımdan kaldırıldı.
Wilfried

Django projelerinin temel yolu zaten standart settings.py olarak tanımlanmıştır BASE_DIR, bu nedenle bunu şu şekilde basitleştirebilirsiniz:os.path.join(BASE_DIR, '../myapp/templates')
ngoue

0

Ş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.]


Bu ne zaman iyi bir fikir olur? Veritabanından şablon yüklemek daha yavaş değil mi?
jguffey

Şablonları db'de depolarsanız db'ye bağımlı olmazsınız, artı db'nizi git commit'lerin bir parçası yapacak mısınız? Şablonlarda farklı kullanıcılar tarafından yapılan değişiklikleri nasıl koordine edeceksiniz?
gautamaggarwal

Bu, git'in farkına varmadan önce yazılmıştı. O sırada svn kullandığımdan bile emin değilim. Şimdi sürüm kontrol sistemlerini kullanmanızı tavsiye ederim.
TonyM

@tonemcd, bu depo silindi.
lmiguelvargasf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.