在Django中管理多个应用程序的静态文件

时间:2011-08-25 14:42:17

标签: django django-staticfiles

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

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

我解决它的方法是从django.contrib.staticfiles.finders.AppDirectoriesFinder移除STATICFILES_FINDERS并使用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)。当然我可以手动添加管理员,但我不知道如何在不破坏管理员的情况下执行此操作,管理员具有不同的目录结构。

  

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

1 个答案:

答案 0 :(得分:45)

这与使用特定于应用程序的templates目录时出现的问题相同。如果您只是将文件直接放在应用程序中的templates下,如果两个应用程序甚至项目级templates目录使用相同名称的模板,您最终会遇到名称冲突。解决方法是将模板实际放在templates目录中的app名称目录中,如:

- 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而不是{{1}}。