В Django нельзя обслуживать статические файлы, но можно обслуживать из медиафайлов

Django - это v5.1

Имеем вот такой settings.py:

STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

INSTALLED_APPS = [
    'main.apps.MainConfig',
    'api.apps.ApiConfig',
    'medialibrary.apps.MedialibraryConfig',
    'blog.apps.BlogConfig',
    'articles.apps.ArticlesConfig',
    'photos.apps.PhotosConfig',
    'drawings.apps.DrawingsConfig',
    'content.apps.ContentConfig',
    'app.apps.AppConfig',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders',
    'strawberry_django',
    'imagefield',
    'mdeditor',
    'django_cleanup.apps.CleanupConfig',
]

Этот urls.py:

urlpatterns = [
    path('graphql', include('api.urls')),
    path('mdeditor/', include('mdeditor.urls')),
    path('admin/', admin.site.urls),
    path('', RedirectView.as_view(url=reverse_lazy('admin:index'))),
]

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

Это переопределение admin/base.html:

{% extends 'admin/base.html' %}

{% load static %}

{% block extrahead %}
  <link rel="shortcut icon" href="{% static 'favicon.ico' %}" />
{% endblock %}

Эта структура:

enter image description here

И он не обслуживает статические файлы из статической папки. Просто показывает 404. Но обслуживает статические файлы из папки media.

Я совершенно не представляю, где здесь может быть ошибка.

Я попытался создать абсолютно чистый новый проект и проделал те же настройки со STATIC без модификации urls.py, и результат тот же - favicon.ico из папки static не обслуживается.

На самом деле вам не нужно добавлять urlpatterns += static(settings.STATIC_URL,document_root=settings.STATIC_ROOT) в urls.py

Проверьте, присутствует ли django.contrib.staticfiles в установленных приложениях и запускаете ли вы его с DEBUG=True. Он должен обслуживать файлы Static с такими настройками

Читать далее

если вы используете django.contrib.staticfile, используйте каталог staticfiles вместо static root в debug.

будет работать.

STATIC_URL = 'static/'
# STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
urlpatterns = [
    path('graphql', include('api.urls')),
    path('mdeditor/', include('mdeditor.urls')),
    path('admin/', admin.site.urls),
    path('', RedirectView.as_view(url=reverse_lazy('admin:index'))),
]

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

Измените код обслуживания статических файлов в файле settings.py на этот.

STATIC_URL = "/staticfiles/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")


STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)

Я создал папку staticfiles и поместил туда файл favicon.ico.

Теперь он работает с такими настройками:

настройки (добавьте STATICFILES_DIRS для статических файлов):

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

урлы (удалите статические для STATIC_URL):

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

Переопределите admin/base.html (ничего не изменилось):

{% block extrahead %}
  <link rel="shortcut icon" href="{% static 'favicon.ico' %}" />
{% endblock %}

И имея работающую команду collectstatic.

Вернуться на верх