为什么 collectstatic 复制到错误的目录?

Why does collectstatic copy to wrong directory?

我以为我了解静态文件、collectstatic 等。但这让我头晕目眩:

settings.py中:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

那我运行

python manage.py collectstatic

那我明白了

You have requested to collect static files at the destination
location as specified in your settings:

    D:\Code\Project\staticfiles

我很确定在某一时刻我确实使用了 'staticfiles'。但是现在我已经将它更改为 'static' 并且它仍然认为目的地应该是静态文件。我已经删除了 __pycache__ 文件夹,但它仍然不起作用。

[更新] 我有一个自定义设置文件。我将其基于 Two Scoops,其中有一个设置文件夹,其中包含 base.py 设置以及 local.py 和 production.py。我是 运行ning 本地人,local.py 只有 db creds 和 DEBUG = True。

我没有 STATICFILES_STORAGE 的任何价值。

如果我printSTATIC_ROOT我看到:

D:\Code\Project\static

[更新] 我现在正在查看 source code。第 161 行的 self.storage.location 是从 django.contrib.staticfiles.storage 的第 5 行导入的。在 storage.py 中,它被设置为等于第 442 行的 ConfiguredStorage()。ConfiguredStorage() 继承了一个名为 LazyObject 的 class 并具有一个名为 _setup 的函数。这就是这条路对我来说变冷的地方。我试图找出 self.storage.location 是如何定义的。但我不知道现在该走哪条路 - 我如何按照面包屑导航回到如何 STATIC_ROOT?

由于您有两个设置,一个用于生产,一个用于开发,您可能需要在 运行 collectstatic 命令时指定设置模块通过使用 --settings 标志。

所以,试试这个

python manage.py collectstatic <b>--settings=path.to.settings.module</b>

更新-1

问题

问题出在这个声明中,
django_heroku.settings(locals())

该特定语句采用所有局部变量(即 local())和 为您的项目创建必要的设置 .

In that module, we can see these statements,

if staticfiles:
    logger.info('Applying Heroku Staticfiles configuration to Django settings.')

    config['STATIC_ROOT'] = os.path.join(config['BASE_DIR'], 'staticfiles')
    config['STATIC_URL'] = '/static/'

这意味着,如果您不这样做,django_heroku 软件包将为您设置一个 STATIC_ROOT 值有一个。 (是的,你的 base.py 中没有 STATIC_ROOT

解决方案

案例 1:将本地设置和生产设置分开 STATIC_ROOT

只需在相应的设置模块中覆盖STATIC_ROOT的值即可,

#settings/local.py
STATIC_ROOT = 'static_root_for_local/'

#settings/production.py
STATIC_ROOT = 'static_root_for_production/'

情况 2:所有设置相同 STATIC_ROOT

# settings/base.py
# other settings variable
django_heroku.settings(locals())

STATIC_ROOT = 'common_static_root/'  # this statement should be after the "django_heroku.settings(locals())"