Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Кто-нибудь сталкивался, что не отображается статика в Django 3.2 (но иногда отображается)?

Столкнулся с чудесным в Django 3.2 ... Не отображается статика из некоторых каталогах внутри static в dev-режиме... Почти во всех, кроме /static/admin/. Ничего не понимаю. В settings.py все как обычно, одинаково с другими проектами, в которых все работает:

from my_project.my_secret import MY_MEDIA_ROOT_DEV1, MY_STATIC_ROOT_DEV1

MEDIA_ROOT = MY_MEDIA_ROOT_DEV1
STATIC_ROOT = MY_STATIC_ROOT_DEV1
STATIC_BASE_PATH = STATIC_ROOT

# STATICFILES_DIRS = [
#     # MY_STATIC_ROOT_DEV1,
#     # Put strings here, like "/home/html/static" or "C:/www/django/static".
#     # Always use forward slashes, even on Windows.
#     # Don't forget to use absolute paths, not relative paths.
#     # BASE_DIR,
#     MY_STATIC_ROOT_DEV1 + '/js',
#     MY_STATIC_ROOT_DEV1 + '/img',
#     MY_STATIC_ROOT_DEV1 + '/webfonts',
#     MY_STATIC_ROOT_DEV1 + '/css',
#     MY_STATIC_ROOT_DEV1 + '/svgs',
# ]

В url.py тоже как и в других проектах:

from django.contrib import admin
from django.urls import path
from django.conf.urls.static import static
from django.conf.urls import url
from my_project import settings
from web import views

urlpatterns = [
    path('a-d-m-i-n/', admin.site.urls),

    url(r'^$', views.index),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Когда делаешь python manage.py collectstatic вся статика, как и положено, собирается в каталог static/admin и любой из этих файлов можно посмотреть. Типа: 127.0.0.1:8000/static/admin/css/base.css... но никаких файлы из других файлов не показываются!.. С ошибкой 404... И не важно, включён и присвоено что-то STATICFILES_DIRS в settings.py или нет... И есть или нет строчка urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) в url.py... И, что особенно странно, если какой-либо файл положить в папку static/admin или там static/admin/js -- этот файл тоже НЕ ОТОБРАЖАЕТСЯ. Видит только файлы которые притащил python manage.py collectstatic... Что за магия такая?
  • Вопрос задан
  • 4123 просмотра
Решения вопроса 2
@maksam07
Честно, не cовсем понял код, но:
settings.py
STATIC_URL = "/staticfiles/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static_files")]

urls.py
if bool(settings.DEBUG):
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

отлично работает. Статика в папке static_files, в дебаге collectstatic не делаю, т.к. нет нужды, делаю только на проде.
Ответ написан
Sergei_Erjemin
@Sergei_Erjemin Автор вопроса
Улыбайся, будь самураем...
Методом тыка выяснил, что почему-то в Django 3.2 не работает STATIC_ROOT ... При этом в документации ничего про эти изменения нет. В общем, заработало так:

settings.py:
from my_project.my_secret import *

# ...
# ...
# ...

STATIC_URL = '/static/'
MEDIA_URL = '/media/'

if DEBUG:     
    if socket.gethostname() == MY_HOST_HOME:      # домашний комп
        MEDIA_ROOT = MY_MEDIA_ROOT_DEV1
        STATICFILES_DIRS = [MY_STATIC_ROOT_DEV1, ]
    if socket.gethostname() == MY_HOST_WORK:      # офис комп
        MEDIA_ROOT = MY_MEDIA_ROOT_DEV2
        STATICFILES_DIRS = [MY_STATIC_ROOT_DEV2, ]

В url.py ничего про каталог static не пишем вообще:
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

В общем странно, похоже они в Django 3.2 отказались от STATIC_ROOT в пользу более гибкого STATICFILES_DIRS... Почему в документации про это не написано -- ещё страннее. И совсем странно, что если оставить присвоение STATIC_ROOT -- все ломается.

А вот применение MEDIA_ROOT оставили без изменений, работает как прежде, и даже запись в url.py для него обязательна.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы