Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中模板和静态文件的位置_Django_Static Files_Convention - Fatal编程技术网

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

Django中模板和静态文件的位置,django,static-files,convention,Django,Static Files,Convention,我正在计划一个新的Django项目,希望一切正常。我在如何组织项目目录布局的问题上绊倒了。幸运的是,网络上有很多优秀项目模板的例子。不过,有一件事我很难在脑海中找到: 建议将模板文件放入项目根目录下的单独目录中,该目录由应用程序划分为子目录。因此,模板不在应用程序目录中。这对我来说似乎是合乎逻辑的,因为我们想要将应用程序逻辑与表示逻辑分离。但是静态文件呢?在这里,通常的做法似乎是在app dirs中定位静态文件,并在开发时(collectstatic)将它们加载到项目根目录下的“static”目

我正在计划一个新的Django项目,希望一切正常。我在如何组织项目目录布局的问题上绊倒了。幸运的是,网络上有很多优秀项目模板的例子。不过,有一件事我很难在脑海中找到:

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


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

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

有时候,这是有道理的。有时候,它不是-这是你的决定

例如,我将静态媒体放在
site\u media
目录(全局css、全局图像等)中,但将特定于应用程序的媒体放在
app/static
中。例如,如果我有一个
Poll
应用程序,我的媒体很可能只用于Poll应用程序模板,而不是我的站点索引

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

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


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

我实际上为每个应用程序在目录中放置了模板,我认为这是有意义的。由于其他一切都发生在Python文件中,所以仍然有逻辑分离

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


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

我认为在应用程序目录中组织模板和静态文件对于可插拔应用程序是有意义的。但如果我不打算创建可插拔的应用程序,那就没有好处了,不是吗?每次部署项目的新版本时,我只需要调用
collectstatic
。@J0ker,这是可以讨论的,完全是您的要求。有时,如果它是一个独立打包的应用程序,我会发现自己使用的是
app/static
。其他时候,对于所有与核心网站相关的一组应用程序,我只使用我的
site\u media
文件夹。调用“collectstatic”的开销对我来说已经消除了,因为我使用的结构脚本无论如何都会使用它。另外,如果配置staticfiles存储后端,则可以将collectstatic上载到AmazonS3,这非常有用。