Django view – load template from calling app’s dir first

The reason for this is that the app_directories loader is essentially the same as adding each app’s template folder to the TEMPLATE_DIRS setting, e.g. like

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

The problem with this is that as you mentioned, the index.html will always be found in app1/templates/index.html instead of any other app. There is no easy solution to magically fix this behavior without modifying the app_directories loader and using introspection or passing along app information, which gets a bit complicated. An easier solution:

  • Keep your settings.py as-is
  • Add a subdirectory in each app’s templates folder with the name of the app
  • Use the templates in views like ‘app1/index.html’ or ‘app2/index.html’

For a more concrete example:

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

Then in the views:

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

You could even write a wrapper to automate prepending the app name to all your views, and even that could be extended to use introspection, e.g.:

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

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

The _____name_____.split(“.”)[-2] assumes the file is within a package, so it will turn e.g. ‘app1.views’ into ‘app1’ to prepend to the template name. This also assumes a user will never rename your app without also renaming the folder in the templates directory, which may not be a safe assumption to make and in that case just hard-code the name of the folder in the templates directory.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)