问题描述:
在Django中,我们在views视图函数中配置要访问的模板路径。如下:
def post_list(request, category_id=None, tag_id=None):
return render(request, 'list.html', context={'name': 'post_list'})
在上面的视图函数中,我们设置要访问名为’list.html’的模板文件。
问题分析:
当我们在浏览器中输入对应的URL,调用post_list这个视图函数之后,
Django会按照settings.py文件中INSTALLED_APPS配置的APP顺序,如:
INSTALLED_APPS = [
'blog',
'config',
'comment',
'typeidea',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
去到各个APP目录下的templates目录中(即:先到名为"blog"的APP目录下的templates目录)去寻找访问’list.html’这个模板文件,以此类推,直到找到名为list.html的模板文件。
因此,假设Django项目的不同APP的templates目录中包含了名字同为"list.html"的模板文件,则INSTALLED_APPS中顺序在前的APP目录下的"list.html"模板文件会覆盖掉顺序在后的APP的"list.html"模板文件。
问题解决:
为了解决以上问题,我们可以把Django项目中不同APP的模板文件都放在与工程同名的APP的templates目录中。如:
在上图的Django项目中,包含了blog, comment, config, typeidea四个APP,其中typeidea是和工程同名的APP,即工程目录,是在创建Django项目:django-admin startproject typeidea 时生成的工程目录,在该目录下还包含了settings.py, urls.py, wsgi.py等工程配置文件,我们也可以把它看成一个APP。
在此,我们可以把整个Django项目的所有模板文件都放在typeidea这个APP的templates目录下(记得要把typeidea这个APP配置到settings.py的INSTALLED_APPS 中),然后不同APP的模板文件分别用不同的文件夹进行区分,如上图所示,虽然blog, config这个两个APP的模板文件名字相同,但是他们分别放在blog,config两个不同的文件夹下,所以我们在视图函数中只要分别加上"blog/list.html"或者"config/list.html",就可以访问不同APP的"list.html"模板文件。
所以上面的视图函数更改为:
def post_list(request, category_id=None, tag_id=None):
return render(request, 'blog/list.html', context={'name': 'post_list'})
即可访问blog这个APP的"list.html"模板文件。