Tell django to search app's template subfolders

此生再无相见时 提交于 2019-12-09 13:00:02

问题


I have the following folder structure for the templates on my django app:

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

Suppose I'm using model1 and a generic ListView, right now it only searches at templates/app/model1_form.html. Is there anyway I can tell django he should also search the app/ subfolders? I don't want to have to set the template name and path manually (template_name="templates/app/model1/model1_form.html").

At settings.py I have:

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

This is my view:

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

Thanks in advance!


回答1:


You need to add django.template.loaders.app_directories.Loader to TEMPLATE_LOADERS (if it's not already).

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

Then, change your folder structure such that you have a "templates" folder in the app directory:

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

Or to properly namespace the models so they don't clash with other app names accidentally:

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



回答2:


The other answers were correct at the time, but for anyone coming across this now, this is how this is done in Django 1.8+

By default, Django now looks in app folders for templates. This is indicated by 'APP_DIRS': True, in the TEMPLATES setting like this:

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

As the other answers indicate, you should still use appname/templates/appname/model1_form.html to namespace the templates

( more info: https://docs.djangoproject.com/en/1.8/intro/tutorial03/#write-views-that-actually-do-something in the box titled 'template namespacing')

Final check: make sure the app you're using is in the INSTALLED_APPS tuple, as that was the problem I was having.




回答3:


I think to use templates from subfolders generally you either have to:

  1. Manually give the template path as subdir/template.html
    eg. render_to_response('sub/dir/template.html') or template_name='...'

  2. Define all the subfolders in the TEMPLATE_DIRS
    eg.

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

    But because Generic Views except templates to be found in app_name/template.html, you would have to move your templates to add /path/to/templates/app/model1 to your TEMPLATE_DIRS, and move your templates to templates/your_app/model/your_app/model_template.html, which is little bit awkward.




回答4:


With Django 2.0, it's not even necessary to change anything in the TEMPLATES variable in settings.py. The only requirement is to add appname.apps.AppnameConfig (e.g. catalog.apps.CatalogConfig for an app named 'catalog') to the INSTALLED_APPS list, then django will look under appname/templates when it searches for templates.



来源:https://stackoverflow.com/questions/10386257/tell-django-to-search-apps-template-subfolders

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!