Django's logic for finding templates folders
今天创建新app后,配置路由时发现renturn的html页面串了
即app:show/views.py里面的upload方法return的upload.html
而不是我在show/templates下面创建的,
而是app:picture/templates下面的upload.html文件。
最开始是怀疑app:show/views.py或者show/urls.py里面设置的路由或者文件名字错误,
将其全部修改成为upload2之后发现正常导入了。
但是问题本身并没有被解决,本着继续探索的根源,就继续探索问题根源。
之后将upload2改为upload之后,猜测可能是django命名空间的原因,
于是在官方文档中先后查找
为url添加命名空间(https://docs.djangoproject.com/zh-hans/4.1/intro/tutorial03/#namespacing-url-names)、
URL命名空间(https://docs.djangoproject.com/zh-hans/4.1/topics/http/urls/)
结果并没有找到解决方法,并且了解url命名空间只是为了在html页面寻找路由时做区分,
而不是返回渲染html时寻找html文件做区分
之后猜想可能是django加载templates文件夹的逻辑
于是寻找到如下三篇博客解决了我的疑惑:
其中第三篇最为详细,做简单总结与摘要:
- Django默认会在配置文件setting.py的TEMPLATE_LOADERS中开启'django.template.loaders.filesystem.Loader',
开启该选项后可以按照TEMPLATE_DIRS中列出的路径的先后顺序从中查找并载入模板(templates文件夹) - 可以在setting.py文件的TEMPLATE钟添加 'django.template.loaders.app_directories.Loader',这样就会覆盖掉默认方法,加载逻辑就会变成从APP对应的templates文件夹中加载对应的html文件
- 但第二条列出的方法并不是常用的做法,更常用的做法是在app/templates文件夹内在建立一个app文件夹(app/templates/app),然后将html文件放入内,然后在引用时将路径写为“app/html”。并且在创建app/static文件夹时也采取同样的方法,就相当于是提供了一个命名空间,这样便不用担心Django载入的模板究竟是不是对的、需要的那个模板。
最终问题解决
Ps.在更改html文件的地址之后,使用django的模板语言的继承时,也需要修改地址。
example:
{%extends 'base.html'%} -> {%extend 'app/base.html%}