2011-08-25 122 views
34

我正在开发由许多应用程序组成的Django(1.3)项目。每个应用程序在其自己的static目录下都有自己的静态文件。此外,我添加了一个名为project_static的目录,该目录应包含在各种应用程序(如jQuery)中通用的静态文件。在Django中管理多个应用程序的静态文件

我马上碰到的问题是命名冲突。默认情况下,collectstatic只会将全部内容放在全局的static目录下,而不会按应用程序对其进行分类。这对我不起作用,因为每个应用程序都有 - 例如 - 一个名为css/screen.css的文件。

我解决它是由STATICFILES_FINDERS去除django.contrib.staticfiles.finders.AppDirectoriesFinder和使用namespaced static files dirs的方式,所以我的设置,现在看起来像

STATICFILES_DIRS = (
    os.path.join(PROJECT_PATH, 'project_static'), 
    ('my_app', os.path.join(PROJECT_PATH, 'my_app', 'static')), 
    ('another_app', os.path.join(PROJECT_PATH, 'another_app', 'static')), 
    ... 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
) 

的问题是,这种方式我失去了静态文件的所有其他应用,实例django.contrib.admin。当然,我可以手动添加管理员,但我不知道如何在不破坏具有不同目录结构的管理员的情况下执行此操作。

有更好的方法来管理多个应用程序的静态文件吗?

回答

39

这与使用应用程序特定的templates目录时发生的问题相同。如果您只是将文件直接放在应用程序中的templates下,那么如果两个应用程序甚至项目级别的目录都使用相同名称的模板,则最终会发生名称冲突。造成这种情况的解决方法是居然把模板中的应用程序的名称的目录templates目录中,如:

- some_app 
    - templates 
     - some_app 
      - index.html 

所以,我申请了同样的想法,以静:

- some_app 
    - static 
     - some_app 
      - css 
      - img 
      - js 

这样,当您运行collectstatic时,每个单独的应用程序的静态文件将被放置在名称空间目录中。您需要做的唯一更改是将每个文件与模板中的app-name目录作为前缀。所以,而不是{{ STATIC_URL }}css/style.css你有{{ STATIC_URL }}my_app/css/style.css

+0

如果我们使用nginx提供静态文件,这仍然是首选方法吗? (保持静态文件,模板在应用程序本身) – Dineshkumar

+0

是的。您希望您的项目管理所有资产。 –

相关问题