49

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

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

我解决它的方法是从命名空间静态文件中删除django.contrib.staticfiles.finders.AppDirectoriesFinderSTATICFILES_FINDERS使用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)的静态文件。当然我可以手动添加管理员,但我不确定如何在不破坏管理员的情况下执行此操作,管理员具有不同的目录结构。

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

4

1 回答 1

58

templates这与使用特定于应用程序的目录时出现的问题相同。如果您只是将文件直接放在templates应用程序中,如果两个应用程序甚至项目级templates目录使用相同名称的模板,您最终会出现名称冲突。对此的解决方法是将模板实际放在目录中 app 名称的目录中,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.

于 2011-12-29T22:16:25.247 回答