Шлях шаблону Django


88

Я дотримуюсь підручника з http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 в середовищі Windows 7. Файл моїх налаштувань:

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

Я отримав base_templateіз шаблону admin/base_site.htmlв каталозі шаблонів адміністратора Django за замовчуванням у вихідному коді самого Django (django / contrib / admin / templates) у підкаталог адміністратора каталогу myapp, як зазначено в підручнику.

Здається, це не впливає з якихось причин. Будь-яка підказка, в чому може бути проблема? Чи потрібно робити синхронізацію db?

Відповіді:


182

Я знаю, що цього немає в підручнику з Django, і соромлюся за них, але краще встановити відносні шляхи для змінних шляху. Ви можете налаштувати його так:

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/'),
]

Таким чином ви можете перемістити свій проект Django, і ваші корені шляху оновляться автоматично. Це корисно, коли ви налаштовуєте робочий сервер.

По-друге, у вашому шляху TEMPLATE_DIRS є щось підозріле. Він повинен вказувати на корінь каталогу вашого шаблону. Крім того, це також повинно закінчуватися кінцевим результатом /.

Я просто збираюся тут здогадатися, що .../admin/каталог не є вашим коренем шаблону. Якщо ви все-таки хочете написати абсолютні шляхи, вам слід видалити посилання на каталог адміністративного шаблону.

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

З огляду на це, завантажувачі шаблонів за замовчуванням повинні бути налаштовані на рекурсивний перехід до каталогів ваших програм для пошуку файлів шаблонів.

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

Вам не потрібно копіювати шаблони адміністратора, якщо ви не хочете щось перезаписати.

Вам доведеться запустити syncdb, якщо ви ще не запустили його. Вам також потрібно буде статично серверувати медіа-файли, якщо ви розміщуєте django через runserver.


1
велике спасибі, видаливши "/ admin" наприкінці відносного шляху TEMPLATE_DIRS.
shaytac

1
Ця пропозиція розміщує каталог шаблонів усередині папки проекту. Для кращої організації чи є сенс поміщати його всередину папки програми?
Sahas Katta

2
Це вирішило мою проблему. Дякую. АЛЕ, у файлі налаштувань за замовчуванням був коментар із TEMPLATE_DIRS, який сказав: "Не забувайте використовувати абсолютні шляхи, а не відносні шляхи." Хтось знає виправдання цього коментаря?
bhekman

1
PROJECT_PATH - абсолютний шлях до папки проекту. Цей метод динамічно встановлює абсолютний шлях медіа під час виконання, тому значення не кодується жорстко і може автоматично змінюватися з розташуванням проекту. Це стара публікація, але ви можете використовувати її для визначення розташування будь-якої папки чи файлу в проекті.
digitaldreamer

2
Я б запропонував використовувати os.path.joinдля додавання шляхів до базового каталогу.
antonagestam

34

Якщо ви використовуєте налаштування Django як встановлені, то чому б просто не використовувати його вбудовані, заздалегідь визначені BASE_DIR та ШАБЛОНИ? У встановленому pip Django (v1.8) я отримую:

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
цей «BASE_DIR + '/ templates /',» зробив трюк. І це виглядає набагато елегантніше, а не окремий розділ.
Максиллер

2
використовувати os.path.join(BASE_DIR, 'templates')для того, щоб шлях був незалежним від платформи.
Абхюдай

11

Розумне рішення в Django 2.0.3 для збереження шаблонів у каталозі проекту ( /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 просто додайте такий шлях до шаблону:

app_name/html_name

9

Для Django 1.6.6:

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

Також статичні та носії для режиму налагодження та виробництва:

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 ви повинні додати:

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 ви можете встановити шляхи шаблонів, серверну інформацію та інші параметри для шаблонів в одному словнику ( settings.py ):

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

Офіційні документи.


Шлях до шаблону повинен бути кортежем: використовуйте цей TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),)
renderbox

6

У мене також були проблеми з цією частиною підручника (використовувався підручник для версії 1.7).

Моєю помилкою було те, що я редагував лише рядок "Адміністрація Django" і не приділяв достатньо уваги посібнику.

Це рядок з django / contrib / admin / templates / admin / base_site.html :

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

Але через деякий час і розчарування стало зрозуміло, що існує вираз 'site_header або за замовчуванням: _', який слід видалити. Тож після видалення твердження (як у прикладі в посібнику все працювало, як очікувалося).

Приклад посібника:

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

2

Гаразд 😁 Скажімо, у вас є абсолютно новий проект, якщо так, ви б перейшли до settings.pyфайлу та шукали, як TEMPLATESтільки знайдете його, просто вставте цей рядок os.path.join(BASE_DIR, 'template')в 'DIRS'Зрештою, ви повинні отримати щось подібне:

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, введіть ці 3 прості команди:

python3 manage.py shell

Опинившись в оболонці:

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

PS: Якби ви назвали свою папку шаблону іншою назвою, ви б також змінили її тут.


2

У django 3.1 перейдіть до налаштування вашого проекту та імпортуйте os

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


0

в основному BASE_DIRце ваш каталог проекту django, той самий каталог, де 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',
                ],
            },
        },
    ]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.