Django 模型:ValueError:缺少“file_name.ext”的静态文件清单条目

Posted

技术标签:

【中文标题】Django 模型:ValueError:缺少“file_name.ext”的静态文件清单条目【英文标题】:Django Model: ValueError: Missing staticfiles manifest entry for "file_name.ext" 【发布时间】:2018-10-05 03:36:28 【问题描述】:

在你标记为重复之前,我已经阅读了ValueError: Missing staticfiles manifest entry for 'favicon.ico' ,它并没有解决我的问题。

我有以下型号:

from django.contrib.staticfiles.templatetags.staticfiles import static

class Profile(models.Model):
    user = models.ForeignKey(SocialUser, on_delete=models.PROTECT)
    avatar_url = models.URLField(
        default=static('pledges/images/no-profile-photo.png'))

我正在为 CI 使用 Codeship,当我运行时:

$ python manage.py collectstatic --noinput

我收到以下错误:

Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
utility.execute()
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/core/management/__init__.py", line 338, in execute
django.setup()
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/apps/registry.py", line 108, in populate
app_config.import_models()
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/apps/config.py", line 202, in import_models
self.models_module = import_module(models_module_name)
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/home/rof/src/github.com/company-name/project-name/pledges/models.py", line 106, in <module>
class Profile(models.Model):
File "/home/rof/src/github.com/company-name/project-name/pledges/models.py", line 109, in Profile
default=static('pledges/images/no-profile-photo.png'))
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/contrib/staticfiles/templatetags/staticfiles.py", line 12, in static
return _static(path)
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/templatetags/static.py", line 166, in static
return StaticNode.handle_simple(path)
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/templatetags/static.py", line 117, in handle_simple
return staticfiles_storage.url(path)
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/contrib/staticfiles/storage.py", line 162, in url
return self._url(self.stored_name, name, force)
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/contrib/staticfiles/storage.py", line 141, in _url
hashed_name = hashed_name_func(*args)
File "/home/rof/.pyenv/versions/3.6/lib/python3.6/site-packages/django/contrib/staticfiles/storage.py", line 432, in stored_name
raise ValueError("Missing staticfiles manifest entry for '%s'" % clean_name)
ValueError: Missing staticfiles manifest entry for 'pledges/images/no-profile-photo.png'

我在本地没有问题,所以我想知道是什么导致了这个问题以及如何解决它。我从代码中了解到,我不能将函数static 用于模型字段。

有人知道如何解决这个问题吗?有人可以解释一下为什么会这样吗?

【问题讨论】:

【参考方案1】:

解决办法:

您可以通过将static() 调用移出模型字段并将默认值更改为字符串"pledges/images/no-profile-photo.png" 来规避此问题并改进代码。它应该是这样的:

avatar_url = models.URLField(default='pledges/images/no-profile-photo.png')

当您访问avatar_url 时,请使用任一

    (前端/Django 模板选项)% static profile_instance.avatar_url %,其中profile_instance 是一个引用 Profile 对象的上下文变量。

    (后端/Python 选项)使用static(profile_instance.avatar_url)

说明:

通过使用static() 的结果作为默认值,应用程序将包含STATIC_URL 前缀的URL 放入数据库中——这就像硬编码一样,因为@987654332 时数据不会改变@ 做。更一般地说,您根本不应该将static() 的结果存储在数据库中。

如果您确保每次访问avatar_url 以在前端显示时都使用% static % 标记或static() 函数,则STATIC_URL 仍将根据您在运行时的环境配置添加.

This SO thread has a lot of good content on staticfiles

为什么会发生错误:

看起来你有一个循环依赖:

    collectstatic 需要运行才能创建manifest.json

    您的应用程序需要加载才能运行manage.py 命令,该命令调用static()

    static() 依赖于 manifest.json 中的条目来解析。

【讨论】:

static("pledges/images/no-profile-photo.png") 产生"/static/pledges/images/no-profile-photo.png",所以我认为两者产生的结果不同。我在设置中有一个名为settings.STATIC_URL 的变量,其值为'/static/',所以我尝试了settings.STATIC_URL + 'pledges/images/no-profile-photo.png',但是这个解决方案不是很好,因为设置是由站点配置的,并且应用程序属于一方,和模型属于应用程序。因此,它使应用程序不可重用。 你的模型字段应该是:avatar_url = models.URLField(default='pledges/images/no-profile-photo.png') 问题是你没有考虑静态文件。检查this 请更具体一点——“不考虑静态文件”是什么意思?如果不知道您正在尝试什么不起作用,就很难提供帮助。我对静态文件文档非常熟悉 您记住有人想要管理他的静态文件。假设有人想要将STATIC_URL 设为/static/

以上是关于Django 模型:ValueError:缺少“file_name.ext”的静态文件清单条目的主要内容,如果未能解决你的问题,请参考以下文章

Django ValueError:缺少静态文件清单条目,但清单似乎显示了该条目

ValueError:即使在 collectstatic 之后也缺少静态文件清单条目

ValueError:缺少“favicon.ico”的静态文件清单条目

Django - Celery ValueError:无法解析相关模型 u'user.User'

当我在同一个模型中引用一个类时,为啥 Django 会给我一个 ValueError?

valueerror: 生成 csv 文件并在 django 中保存到模型时对已关闭文件的 i/o 操作