python manage.py startapp application
python manage.py startapp customers
D:\projectName\APPLICATION
├───migrations
│ └───__pycache__
├───templates
│ ├───auth
│ └───includes
└───__pycache__
D:\projectName\CUSTOMERS
├───migrations
│ └───__pycache__
├───templates
└───__pycache__
In both templates there is an index.html - In CUSTOMERS also there is an index.html in templates folder.
customers\urls.py
from customers import views
from django.urls import path
urlpatterns = [
path('', views.index),
]
In projectName’s settings.py :
path('', views.index, name='index'),
path('customers/', include('customers.urls'))
But in my customers/views.py I have to do :
return render(request, '../../customers/templates/index.html')
because return render(request, 'index.html') is returning application/templates/index.html
How can I add template folders from each app to 'DIRS': [BASE_DIR / 'templates'] in Django 4.1 ?
You should definitely namespace your templates. I did not found this on the docs, but there’s one point that says it.
So namespacing a template would be:
app1/templates/app1/index.html instead of app1/templates/index.html. The same applies for others apps. By doing this you then can render your templates like: app1/index.html
Actually, i found it on the docs.
Take a look on the green box at the end of that section
Additionally, even with the templates being properly namespaced, you want to make sure that your TEMPLATES settings contains the APP_DIRS: True attribute.
APP_DIRS: True is there by default in Django 4.1.
To actually get this working I had to do :
customers\templates\customers.index.html
Even customers\templates\customers\index.html won’t make it. It’ll still pull from applications\templates\index.html
I hope there is way to auto-detect this in the future versions.
Other options is to put all templates in D:\projectName\templates
Correct. That’s the wrong reference to put in the render call.
With APP_DIRS: True, the reference would just be to customers/index.html
I’m not sure what you’re looking for it to autodetect. It works exactly as designed and intended.
It isn’t. Its taking in index.html from application/templates/index.html
It seems to look for the first location of index.html
No, that is either not accurate or not complete.
If
- your TEMPLATES settings includes
APP_DIRS: True
and
- the
index.html is in the location project/customers/templates/customers/index.html,
and
- you do not have an
index.html in project/templates/customers/index.html,
then render(request, 'customers/index.html') will render the index.html in project/customers/templates/customers.
If it is not, then you have something wrong.