Загруженные пользователем файлы и работа с изображениями
При работе с медиафайлами в Django нам нужно изменить некоторые настройки, чтобы хранить файлы локально и обслуживать их по мере необходимости.
В частности, нам нужно установить MEDIA_URL и MEDIA_ROOT в настройках.
-
MEDIA_ROOT: полный путь к каталогу, в котором хранятся загруженные файлы. Обычно мы храним такие файлы, создавая каталог внутри базового каталога проекта. -
MEDIA_URL: базовый URL-адрес для обслуживания медиафайлов. Это то, что позволяет нам получать доступ к мультимедиа через наш веб-браузер.
Поэтому в settings.py добавим следующий код:
MEDIA_ROOT = BASE_DIR/'media'
MEDIA_URL = '/media/'
Теперь мы должны настроить urls.py проекта для обслуживания загруженных пользователем медиафайлов во время разработки (когда debug=True).
Для этого изменим код в mysite/urls.py:
from django.urls import path, include
from django.contrib import admin
from django.contrib.sitemaps.views import sitemap
from blog.sitemaps import PostSitemap
from django.conf import settings
from django.conf.urls.static import static
sitemaps = {
'posts': PostSitemap,
}
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls', namespace='blog')),
path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'),
path("accounts/", include("accounts.urls")),
path("accounts/", include("django.contrib.auth.urls")),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Теперь мы можем добавлять файлы в корневую папку мультимедиа, и Django будет обслуживать их из URL-адреса мультимедиа:
Как вы можете видеть на изображении выше, изображение профиля, которое загружают пользователи, будет хранится внутри /media/profile_images/.
Изображение профиля по умолчанию, которое предоставляется пользователям, находится внутри /media/, поэтому поместите любое изображение по умолчанию, которое вы хотите, в этот каталог с именем default.jpg.
В качестве примера вы можете использовать данное изображение - https://disk.yandex.ru/i/4zy-Lc1ZE2dhhw.