【问题标题】:Managing static files for multiple apps in Django在 Django 中管理多个应用程序的静态文件
【发布时间】:2011-11-03 18:38:00
【问题描述】:

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

我立即遇到的问题是命名冲突。默认情况下,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)。当然我可以手动添加管理员,但我不确定如何在不破坏管理员的情况下执行此操作,因为管理员的目录结构不同。

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

【问题讨论】:

    标签: django django-staticfiles


    【解决方案1】:

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

    - some_app
        - templates
            - some_app
                - index.html
    

    所以,我将同样的想法应用于静态:

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

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

    【讨论】:

    • 如果我们使用 nginx 提供静态文件,这仍然是首选方式吗? (在应用程序中保留静态文件、模板)
    • 便携性不是很好,但可能是最好的简单解决方案
    猜你喜欢
    • 2012-04-15
    • 2020-06-28
    • 2017-06-21
    • 2011-10-24
    • 2012-02-21
    • 1970-01-01
    • 2021-01-06
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多