Скажите django для поиска вложенных папок шаблона приложения

у меня есть следующая структура папок для шаблонов в моем приложении django:

templates/
   app/
      model1/
         model1_form.html
      model2/ 
         model2_form.html

предположим, я использую model1 и общий ListView, прямо сейчас он ищет только в шаблонах / app / model1_form.формат html. В любом случае, я могу сказать django, что он также должен искать приложения/ подпапки? Я не хочу устанавливать имя шаблона и путь вручную (template_name="templates/app/model1/model1_form.html").

At settings.py у меня:

import os.path
BASE_PATH = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = (
    BASE_PATH+'/templates/',
)

вот мой взгляд:

class HousesListView(ListView):
    model = House
    context_object_name = "house_list"

спасибо вперед!

4 ответов


вам нужно добавить django.template.loaders.app_directories.Loader to TEMPLATE_LOADERS (если уже не).

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

затем измените структуру папок так, чтобы у вас была папка" шаблоны " в каталоге приложения:

- <project_root>
    - app
        - templates
            - model1
            - model2

или правильно пространство имен моделей, чтобы они не конфликтовали с другими именами приложений случайно:

- <project_root>
    - app
        - templates
            - app
                - model1
                - model2

другие ответы были правильными в то время, но для тех, кто сталкивается с этим сейчас, вот как это делается в Django 1.8+

по умолчанию Django теперь ищет шаблоны в папках приложений. На это указывает 'APP_DIRS': True, на TEMPLATES настройки вроде этого:

TEMPLATES = [
  {
    ...
    'DIRS': ['templates'],
    'APP_DIRS': True,
    ...
  },
]

как показывают другие ответы, вы все равно должны использовать appname/templates/appname/model1_form.html в пространстве имен шаблоны

( подробнее: https://docs.djangoproject.com/en/1.8/intro/tutorial03/#write-views-that-actually-do-something в поле "пространство имен шаблонов")

последняя проверка: убедитесь, что приложение, которое вы используете в INSTALLED_APPS Кортеж, так как это была проблема, с которой я столкнулся.


Я думаю, что использовать шаблоны из папки, как правило, вы должны либо:

  1. вручную укажите путь к шаблону как subdir/template.html
    например. render_to_response ('sub/dir / template.html') или template_name='...'

  2. определите все подпапки в TEMPLATE_DIRS
    например.

    TEMPLATE_DIRS = (
    BASE_PATH+ ' / templates/',
    BASE_PATH+ '/ templates / app',
    BASE_PATH+ '/ templates / app / model1',
    )

    но потому, что общие представления, кроме шаблонов, которые можно найти в app_name / template.формат html, вам нужно будет переместить шаблоны, чтобы добавить /path/to/templates/app/model1 в TEMPLATE_DIRS и переместите шаблоны в templates/your_app/model/your_app/model_template.html, что немного неудобно.


С Django 2.0 даже не нужно ничего менять в TEMPLATES переменная settings.py. Единственное требование-добавить appname.apps.AppnameConfig (например,каталог.приложения.CatalogConfig для приложения с именем 'каталог') к INSTALLED_APPS список, затем django будет искать под appname / templates при поиске шаблонов.