Django'nun şablonları bulmak ve yüklemek için kullandığı yol nedir?


91

Bu öğreticiyi bir Windows 7 ortamında takip ediyorum .

Ayarlar dosyam şu tanıma sahip:

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

base_templateŞablondan admin/base_site.html, Django'nun kaynak kodundaki varsayılan Django yönetici şablon dizininden (django / katkı / admin / şablonlar) myappöğreticide belirtildiği gibi dizinin yönetici alt dizinine aldım , ancak etki etmiyor gibi görünüyor bazı sebeplerden dolayı.

Sorunun ne olabileceğine dair bir ipucu var mı?

Yanıtlar:


185

Bunun Django eğitiminde olmadığını biliyorum ve onları utandırıyorum, ancak yol değişkenleriniz için göreceli yollar ayarlamak daha iyidir. Bunu şu şekilde kurabilirsiniz:

import os.path

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

TEMPLATE_DIRS = [
    os.path.join(PROJECT_PATH, 'templates/'),
]

Bu şekilde Django projenizi taşıyabilirsiniz ve yol kökleriniz otomatik olarak güncellenir. Bu, üretim sunucunuzu kurarken kullanışlıdır.

İkinci olarak, TEMPLATE_DIRS yolunuzda şüpheli bir şey var. Şablon dizininizin köküne işaret etmelidir. Ayrıca, bir takip ile de bitmelidir /.

Burada .../admin/dizinin şablon kökünüz olmadığını tahmin edeceğim . Yine de mutlak yollar yazmak istiyorsanız, yönetici şablon dizinine referansı çıkarmanız gerekir.

TEMPLATE_DIRS = [
    'C:/django-project/myapp/mytemplates/',
]

Bununla birlikte, şablon yükleyiciler varsayılan olarak şablon dosyalarını bulmak için uygulama dizinlerine yinelemeli olarak geçecek şekilde ayarlanmalıdır.

TEMPLATE_LOADERS = [
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    # 'django.template.loaders.eggs.load_template_source',
]

Özellikle bir şeyin üzerine yazmak istemiyorsanız, yönetici şablonlarını kopyalamanıza gerek yoktur.

Henüz çalıştırmadıysanız bir syncdb çalıştırmanız gerekecektir. Ayrıca, django'yu runserver aracılığıyla barındırıyorsanız, medya dosyalarınızı statik olarak sunmanız gerekir.


1
TEMPLATE_DIRS göreli yolunun sonundaki "/ admin" i kaldırarak çok teşekkürler.
shaytac

1
Bu öneri, şablonlar dizinini proje klasörünün içine koyar. Daha iyi bir organizasyon için, onu bir uygulamanın klasörüne koymak daha mantıklı olur mu?
Sahas Katta

2
Bu benim sorunumu çözdü. Teşekkürler. ANCAK, varsayılan ayarlar dosyasında TEMPLATE_DIRS ile "Göreli yolları değil, mutlak yolları kullanmayı unutmayın." Bu yorumun gerekçesini bilen var mı?
bhekman

1
PROJECT_PATH, proje klasörünün mutlak yoludur. Bu yöntem, mutlak ortam yolunu çalışma zamanında dinamik olarak ayarlar, böylece değer sabit kodlanmaz ve projenin konumuyla otomatik olarak değişebilir. Bu eski bir gönderidir, ancak bunu projedeki herhangi bir klasör veya dosyanın konumunu tanımlamak için kullanabilirsiniz.
digitaldreamer

2
os.path.joinTemel dizine yollar eklemek için kullanmanızı öneririm .
antonagestam

35

Django ayarlarını kurulu olarak kullanıyorsanız, neden sadece önceden tanımlanmış, önceden tanımlanmış BASE_DIR ve ŞABLONLAR kullanılmıyor? Django (v1.8) yüklü pip'te şunları elde ediyorum:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            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',
            ],
        },
    },
]

1
bu «BASE_DIR + '/ templates /',» hile yaptı. Ayrı bir bölümden çok daha zarif görünüyor.
Maxiller

2
os.path.join(BASE_DIR, 'templates')yolun platformdan bağımsız olması için kullanın .
Abhyudai

12

Şablonları proje dizininde tutmak için Django 2.0.3'te akıllı çözüm ( /root/templates/app_name):

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...

views.py'de böyle bir şablon yolu ekleyin:

app_name/html_name

9

Django 1.6.6 için:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')

Ayrıca hata ayıklama ve üretim modu için statik ve ortam:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%

Urls.py içine şunları eklemelisiniz:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Django 1.8'de, bir sözlükte ( settings.py ) şablonlar için şablon yolları, arka uç ve diğer parametreleri ayarlayabilirsiniz :

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            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',
            ],
        },
    },
]

Resmi belgeler.


Şablon yolunun bir demet olması gerekir: bu TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),)
renderbox

6

Ayrıca öğreticinin bu bölümünde sorunlar yaşadım (sürüm 1.7 için kullanılan eğitim).

Hatam, yalnızca 'Django yönetimi' dizesini düzenledim ve kılavuza yeterince dikkat etmedim.

Bu, django / Contrib / admin / templates / admin / base_site.html'den gelen satırdır :

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>

Ancak bir süre ve hayal kırıklığından sonra, kaldırılması gereken 'site_header veya default: _' ifadesinin olduğu ortaya çıktı. Yani ifadeyi kaldırdıktan sonra (kılavuzdaki örnek gibi, her şey beklendiği gibi çalıştı).

Örnek kılavuz:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>

2

Pekala 😁 Let Diyelim ki gider böylece eğer, yepyeni bir projemiz var demek settings.pyiçin dosya ve arama TEMPLATESbuldunuz kez sadece bu çizgiyi yapıştırmak os.path.join(BASE_DIR, 'template')içinde 'DIRS', böyle birşeyler almalısınız Sonunda:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        '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',
            ],
        },
    },
]

BASE_DIR dizininizin nerede olduğunu bilmek istiyorsanız şu 3 basit komutu yazın:

python3 manage.py shell

Kabuğa girdikten sonra:

>>> from django.conf import settings
>>> settings.BASE_DIR

Not: Şablon klasörünüze başka bir ad verdiyseniz, onu burada da değiştirirsiniz.


2

Django 3.1'de, projenizin ayarlarına gidin ve işletim sistemini içe aktarın

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',
            ],
        },
    },
]

1

Django 2.2'de bu burada açıklanmıştır

https://docs.djangoproject.com/en/2.2/howto/overriding-templates/

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

INSTALLED_APPS = [
    ...,
    'blog',
    ...,
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]

1

Bu ileti dizisinde yayınlanan bazı yanıtların aksine, Django'nun şablonları aradığı varsayılan yol 'DIRS': ['templates']olduğundan eklemenin hiçbir etkisi yoktur (gereksizdir) templates.

Bir uygulamanın şablonuna başvurmaya çalışıyorsanız, uygulamanızın INSTALLED_APPSana proje listesinde yer aldığından emin olun settings.py.

INSTALLED_APPS': [
   # ...
   'my_app',
]

Django'nun Şablon belgelerine alıntı yapmak :

sınıf DjangoTemplates¶

Bir Django şablon motorunu yapılandırmak için GERİEND'i 'django.template.backends.django.DjangoTemplates' olarak ayarlayın.

APP_DIRS True olduğunda, DjangoTemplates motorları kurulu uygulamaların şablonlar alt dizininde şablonları arar . Bu genel ad, geriye dönük uyumluluk için tutuldu.

Projeniz için bir uygulama oluşturduğunuzda, uygulama templatesdizininin içinde bir dizin yoktur. Şablon kullanmadan bir uygulamaya sahip olabileceğinizden, Django böyle bir dizin oluşturmaz. Yani, onu oluşturmanız ve şablonlarınızı orada saklamanız gerekir.

İşte Django Tutorial belgelerinden daha da net olan başka bir paragraf :

Projenizin ŞABLONLAR ayarı, Django'nun şablonları nasıl yükleyeceğini ve işleyeceğini açıklar. Varsayılan ayarlar dosyası, APP_DIRS seçeneği True olarak ayarlanmış bir DjangoTemplates arka ucunu yapılandırır. Geleneksel olarak DjangoTemplates, INSTALLED_APPS'nin her birinde bir “şablonlar” alt dizini arar.


1
İyi söyledin. Şablon belgelerine ve templatesdizinle ilgili söylediklerinden bahsetmeye değer .
ivanleoncz

0

temelde BASE_DIRdjango proje dizininizdir, aynı dizindir manage.py.

    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',
                ],
            },
        },
    ]

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.