Django中模板和静态文件的位置

时间:2012-02-02 23:57:45

标签: django static-files convention

我正在计划一个新的Django项目,并且想要把一切都搞好。我偶然发现了如何组织项目目录布局的问题。幸运的是,网上有很多好的项目模板示例。不过,有一件事我很难想到:

建议将模板文件放入项目根目录下的单独目录中,该目录由应用程序划分为子目录。因此,模板不在应用程序目录中。这似乎是合理的,因为我们想要将应用程序逻辑与表示逻辑分开。但静态文件怎么样?在这里,通常的做法似乎是在app dirs中定位静态文件,并在开发时将它们加载到项目根目录下的“静态”目录中(collectstatic)。这个逻辑我不明白。由于静态文件(即js,css,images)通常在模板内访问,而不是在应用程序代码中访问,因此我将它们计为表示逻辑。那么为什么它们不像模板那样存储 - 项目根目录下的目录,单个应用程序的子目录?

我知道我可以将这些文件存储在任何我想要的地方,但我想人们可能有这么好的理由这样做。这可能是什么原因?

2 个答案:

答案 0 :(得分:9)

静态文件可以放在相关的应用程序中,就像通常将与特定应用程序相关的模板放在应用程序目录中一样。

有时,这是有道理的。有时候,它并不是你的电话。

例如,我将静态媒体放在site_media目录(全局css,全局图像等)中,但将特定于应用的媒体放在app/static中。例如,如果我有一个Poll应用,那么我的媒体很有可能仅用于投票应用模板,而不是我的网站索引。

模板也是如此:我将全局模板(base.html)放在全局模板目录中,但特定于应用的模板放在myapp/templates/myapp/foo.html中。

最后,它对于可插拔应用程序尤为重要。例如,django的静态文件存储在应用程序中,但在静态文件目录中可以访问,即使应用程序位于python路径上的某个位置。以前,您必须将媒体目录或符号链接复制到它。

staticfiles应用程序非常闪亮,因为它允许您在一个位置组织与应用程序相关的所有文件:应用程序文件夹。 collectstatic负责处理其余部分,并使其在Web服务器的一个位置可用。

答案 1 :(得分:5)

我实际上将模板放在每个应用程序的目录中,我认为这是有道理的。你仍然可以分离逻辑分离,因为其他一切都发生在Python文件中。

但是,将模板目录放在应用程序中意味着如果事实证明该应用程序对其他项目很有用,则可以直接将应用程序复制到新项目中。您可以通过在根模板文件夹中创建备用模板来覆盖这些模板。

出于这个原因,静态目录应该存储在app目录中;它允许您根据特定应用程序所需的内容非常清晰地组织资源,这就是为什么staticfiles应用程序首先创建的原因。