我非常困惑于将模板文件和静态文件放在哪里。
我完全理解绝对路径和相对路径,但我似乎找不到任何与我的安装相匹配的说明。我知道这类似于其他问题,但这些答案并不奏效。我观看的成功构建一个简单应用程序的视频没有将模板放在Project文件夹中,这是逻辑告诉我它们应该在的地方
我的Python位于:
C: \ Python27
Django(v1.6.5(,网址:
C: \ Python27\Lib\站点包\django
我创建了一个项目"mysite"和一个名为"films"的应用程序。
项目"mysite":
C: \Python27\Scripts\venv\mysite
和应用程序"电影":
C: \Python27\Scripts\venv\mysite\films
我看的视频让我把模板放在:C: \Python27\Lib\site-packages\django\contrib\admin\templates
但这似乎完全是愚蠢的,因为模板在项目和应用程序之外。
- 我不应该在Project文件夹中放一个模板文件夹吗:C: \Python27\Scripts\venv\mysite\templates
然后使用应用程序名称创建子目录?
-
我需要编辑哪些文件(以及如何(来告诉Django在哪里可以找到它们?
-
对静态文件(css,images(执行类似的过程?
与所有框架一样,如果您遵循一些准则(并放弃一些控制(,django将提供巨大的好处。诀窍是要知道这些准则是什么。
对于模板:
-
如果模板没有绑定到特定的应用程序,请将其放在项目根目录的
templates
目录中。将此目录的完整路径添加到TEMPLATE_DIRS
。 -
所有其他模板都应该放在应用程序目录中名为
templates
的目录中。因此,如果您的应用程序名为myapp
,则myapp
的模板将进入myapp/templates/
对于静态文件:
-
对于与特定应用程序相关的文件,在应用程序目录中创建一个名为
static
的目录,然后在其中创建一个具有应用程序名称的目录。因此,如果您的应用程序名为myapp
,那么您将拥有myapp/static/myapp
。将此应用程序的所有静态内容放在此处;例如CCD_ 10。 -
对于通用的静态文件,请在项目的根目录中创建一个名为
assets
(或static
(的目录。将此目录的完整路径添加到STATICFILES_DIRS
。
默认情况下,django将搜索INSTALLED_APPS
中列出的所有应用程序,并将任何templates
和static
目录添加到其文件搜索路径中。默认情况下,管理员就是这样工作的,而无需配置任何内容。
如果您选择将模板和静态文件放置在其他位置,则只需要修改TEMPLATE_DIRS
和STATICFILES_DIRS
设置。如果您的所有模板和静态资产都与应用程序绑定,那么只需如上所述创建目录就可以使一切正常工作。
如果您想知道为什么需要在myapp/static/
下创建另一个目录来存储静态文件,这更多的是为了便于移植。collectstatic
命令是一个简单的"复制并替换"实用程序。它将覆盖STATIC_DIR
位置中的所有文件。这意味着,如果两个应用程序具有相同名称的某个静态文件,它们将被覆盖而不会发出警告。添加子目录可以防止应用程序的静态资产被覆盖,因为将创建确切的路径。
假设您有两个应用程序,app1
和app2
,并且它们各自对应的目录中都有一个名为style.css
的文件:
app1/static/css/style.css
app2/static/css/style.css
当您运行collectstatic
时,您将得到以下结果(假设static
是您的STATIC_DIR
设置的名称(:
static/css/style.css
这可能是来自app1或app2的style.css,另一个无法确定(实际上是基于INSTALLED_APPS顺序(。为了防止这种情况,如果你有:
app1/static/app1/css/style.css
app2/static/app2/css/style.css
现在,你会得到:
static/app1/css/style.css
static/app2/css/style.css
这两个文件都将被保留。
您也不应该将代码放在虚拟环境目录中。虚拟环境不是源代码的一部分,将项目放在同一目录中可能会在以后出现问题。
为您的环境创建一个目录——我称之为envs
(我知道这很有创意(。在此目录中创建所有环境。一旦激活了环境,就可以在系统中的任何目录中工作,并且将为该环境的Python配置shell。
最后,要获得最佳、准确、最新的信息,请始终参阅django手册和教程。几乎所有其他资源(甚至是经常被提及的djangobook.com(都已经过时了。