现在,我有一个有两个项目的Django网站。一个是根项目,另一个是应用程序。
目录结构如下:
- 根项目
--static
--templates
--index.html
--app
--static
--templates
--index.html
setting.py中的相对设置如下:
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__).decode('utf-8')).replace('\\', '/')
STATICFILES_DIRS = (
os.path.join(PROJECT_ROOT, "static"),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
而且,当我想指定“/app/static/templates/index.html”的路径时,我总是在root中获得index.html。如果我在STATICFILES_FINDERS中改变转弯,我将面临同样的问题我想在root中获取index.html。
如何准确地获取其中一个?
答案 0 :(得分:1)
您的目录结构似乎很奇怪......
首先,如果app目录中的index.html
应该是Django模板,它不应该在静态目录下。
另外,您提到您使用的路径/app/static/templates/index.html
实际上根本不起作用。
通常在Django中,/static/
路径将用于访问所有应用程序的静态目录中的静态资源,以及STATICFILES_DIRS
中指定的所有目录,,就好像所有内容来自所有这些目录都“合并”到一个/static/
目录中!
因此,在您的示例中,路径/static/templates/index.html
确实引用了根项目目录中的index.html
,以及来自特定于应用程序的静态目录中的index.html
,这就是为什么你得到的实际文件将取决于指定的静态文件查找器的顺序。
避免此类碰撞的推荐布局是:
-project root
-static
-global static resources accessible via /static/...
-app
-static
-app
-app-specific static resources accessible via /static/app/...
这也适用于app-template目录:
-app1
-templates
-app1
-index.html (referred from Django view as 'app1/index.html')
-app2
-templates
-app2
-index.html (referred from Django view as 'app2/index.html')
编辑以在共享模板上添加信息:
如果您尝试使用其他应用扩展的“基本模板”,我建议使用“通用应用”方法。 您只需创建一个新的应用程序(例如,名称为“common”,尽管您可以根据需要命名),它包含通用模板(以及其他逻辑,如果您愿意),并让特定于应用程序的模板扩展它。 / p>
布局将是:
-app1
-templates
-app1
-index.html
-common
-templates
-common
-base.html
在index.html
中,您会在文件顶部显示{% extends "common/base.html" %}
(如果您不熟悉,请阅读Django docs on template inheritance)。
当然,必须在Django设置中启用common
应用才能实现此功能。