Модель Django: ValueError: отсутствует запись манифеста статических файлов для "file_name.ext" - PullRequest
0 голосов
/ 24 апреля 2018

Прежде чем пометить его как дубликат, я прочитал ValueError: Отсутствует запись манифеста статических файлов для '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'))

Я использую Codeship для CI, и когда я запускаю:

$ 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 Ответ

0 голосов
/ 25 апреля 2018

Решение:

Вы можете обойти эту проблему и улучшить код, переместив вызов static() из поля модели и изменив значение по умолчанию на строку "pledges/images/no-profile-photo.png". Это должно выглядеть так:

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

Когда вы получаете доступ к avatar_url, используйте либо

  1. (опция внешнего интерфейса / шаблонов Django) {% static profile_instance.avatar_url %}, где profile_instance - это переменная контекста, ссылающаяся на объект профиля.

  2. (опция бэкэнда / Python) используйте static(profile_instance.avatar_url).

Пояснение:

Используя результат static() для значения по умолчанию, приложение помещает URL-адрес в базу данных, который включает префикс STATIC_URL, что похоже на жесткое кодирование, поскольку данные не изменяются при settings.py делает В целом, вам не следует вообще хранить результаты static() в базе данных.

Если вы гарантируете, что используете тег {% static %} или static() каждый раз, когда получаете доступ к avatar_url для отображения во внешнем интерфейсе, STATIC_URL все равно будет добавлено в зависимости от конфигурации среды во время выполнения .

Этот поток SO содержит много хорошего контента для статических файлов

Почему происходит ошибка:

Похоже, у вас круговая зависимость:

  1. collectstatic необходимо запустить для создания manifest.json

  2. ваше приложение должно быть загружено для запуска manage.py команд, которые вызывают static()

  3. static() полагается на запись в manifest.json для разрешения.

...