Представление Django - загружает шаблон из вызова dir приложения сначала

Я пытаюсь сохранить несколько последовательную схему именования на своих шаблонах HTML. Т.е. index.html для основного, delete.html для удаляет страницу и т.д. Но app_directories загрузчик всегда, кажется, загружает шаблон из приложения, это является первым в алфавитном порядке.

Есть ли любой способ всегда проверить на соответствие в приложении вызова templates каталог сначала?

Соответствующие настройки в моем settings.py:

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

TEMPLATE_LOADERS = (
    'django.template.loaders.app_directories.load_template_source',
    'django.template.loaders.filesystem.load_template_source',
)
TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'templates'),
)

Я попытался изменить порядок TEMPLATE_LOADERS, без успеха.


Редактирование согласно просьбе Ashok:

Структура dir каждого приложения:

templates/
    index.html
    add.html
    delete.html
    create.html
models.py
test.py
admin.py
views.py

В views.py каждого приложения:

def index(request):
    # code...
    return render_to_response('index.html', locals())

def add(request):
    # code...
    return render_to_response('add.html', locals())

def delete(request):
    # code...
    return render_to_response('delete.html', locals())

def update(request):
    # code...
    return render_to_response('update.html', locals())
31
задан jmagnusson 22 June 2010 в 14:30
поделиться

2 ответа

Причина в том, что загрузчик app_directories, по сути, аналогичен добавлению папки шаблона каждого приложения в параметр TEMPLATE_DIRS, например как

TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'app1', 'templates'),
    os.path.join(PROJECT_PATH, 'app2', 'template'),
    ...
    os.path.join(PROJECT_PATH, 'templates'),
)

Проблема в том, что, как вы упомянули, index.html всегда будет находиться в app1 / templates / index.html, а не в любом другом приложении. Нет простого решения волшебным образом исправить это поведение без изменения загрузчика app_directories и использования интроспекции или передачи информации о приложении, что немного усложняется. Более простое решение:

  • Сохраните файл settings.py как есть
  • Добавьте подкаталог в папке шаблонов каждого приложения с именем приложения
  • Используйте шаблоны в представлениях, например 'app1 / index.html' или ' app2 / index.html '

Для более конкретного примера:

project
    app1
        templates
            app1
                index.html
                add.html
                ...
        models.py
        views.py
        ...
    app2
        ...

Затем в представлениях:

def index(request):
    return render_to_response('app1/index.html', locals())

Вы даже можете написать оболочку для автоматизации добавления имени приложения ко всем вашим представлениям, и даже это можно расширить до используйте интроспекцию, например:

def render(template, data=None):
    return render_to_response(__name__.split(".")[-2] + '/' + template, data)

def index(request):
    return render('index.html', locals())

_____ имя _____. split (".") [- 2] предполагает, что файл находится в пакете, поэтому он будет включать, например, app1.views в app1, чтобы добавить его к имени шаблона. Это также предполагает, что пользователь никогда не переименует ваше приложение, не переименовав папку в каталоге шаблонов, что может быть небезопасным предположением и в этом случае просто жестко запрограммируйте имя папки в каталоге шаблонов.

49
ответ дан 27 November 2019 в 22:08
поделиться

app_loader ищет шаблоны в ваших приложениях, чтобы они были указаны в INSTALLED_APPS. ( http://docs.djangoproject.com/en/dev/ref/templates/api/#loader-types ).

Я предлагаю поставить перед именем файла шаблона имя приложения, чтобы избежать конфликтов имен.

Например, каталог шаблона для app1 будет выглядеть так:

templates/
    app1_index.html
    app1_delete.html
    app1_add.html
    app1_create.html
5
ответ дан 27 November 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: