Причина этого заключается в том, что загрузчик 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', чтобы добавить к имени шаблона. Это также предполагает, что пользователь никогда не переименует ваше приложение без переименования папки в каталоге шаблонов, что не может быть безопасным предположением, и в этом случае просто жестко закодируйте имя папки в каталоге шаблонов.