0

现在,我有一个 Django 网站,它有两个项目。一个是根项目,另一个是应用程序。

目录结构如下:

--root 项目
   --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中的转弯,当我想要时我会遇到同样的问题在根目录中获取 index.html。

我怎样才能准确地得到其中之一?

4

1 回答 1

1

你的目录结构看起来很奇怪......

首先,如果index.htmlapp 目录应该是 Django 模板,它不应该在静态目录下。

另外,您提到您使用了 path /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”,尽管您可以随意命名),并让特定于应用程序的模板对其进行扩展。

布局将是:

 -app1
  -templates
   -app1
    -index.html
 -common
  -templates
   -common
    -base.html

并且index.html您将{% extends "common/base.html" %}在文件的顶部找到(如果您不熟悉模板继承,请阅读 Django 文档)。

当然,common必须在 Django 设置中启用该应用程序才能正常工作。

于 2013-10-25T09:11:27.760 回答