Невозможно получить доступ к медиафайлу, даже если файл существует при проверке вручную
У меня есть медиафайл, к которому Django не может получить доступ, даже если он определенно существует, если я ввожу его URL в браузере.
Info
- Language: Python [v.3.9.7]
- Platform: Django [v.3.2.8]
Гол
Возможность доступа к медиафайлу
Описание
Дело в том, что люди могут загружать книги на мой сайт. Люди загружают изображения этих книг разных размеров, поэтому я хочу иметь возможность обрабатывать их все, поэтому я получаю доступ к ширине и высоте изображения, а затем использую их в качестве размера изображения в представлении (CSS). Для этого я использовал пользовательский фильтр image_size
, который будет выполнять всю работу по доступу к изображению и определению его размера, который я отправляю обратно в представление:
@register.filter
def image_size(img, host):
img = host[0] + "://" + host[1] + img
with Image.open(img) as image:
width, height = image.size
dct = {
"width": width,
"height": height
}
return dct
Здесь host[0]
- это протокол (request.scheme
) URL изображения, а host[1]
- имя хоста (request.get_host()
). Вот мое представление:
def all_books(request):
if request.user.is_authenticated:
context = {
"books": Book.objects.all(),
"request": request,
"user_profile": UserProfileInfo.objects.get(user=request.user),
"mail_sent": False,
}
else:
context = {
"books": Book.objects.all(),
"request": request,
"mail_sent": False,
"user_profile": False,
}
context["host"] = [request.scheme, request.get_host()]
if request.GET.get("context") == "mail_sent":
context["mail_sent"] = True
return render(request, 'main/all_books.html', context)
settings.py static and media config:
STATIC_URL = '/static/'
STATICFILES_DIRS = [STATIC_DIR,]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
LOGIN_URL = '/main/user_login/'
Где BASE_DIR
является Path(__file__).resolve().parent.parent
(Path
импортируется из pathlib
)
Я не сделал collectstatic
потому что по какой-то причине он удаляет связь с CSS и внезапно никакой CSS не отображается.
Что нужно сделать, чтобы он заработал?
Загруженные файлы попадают в MEDIA_ROOT, если в поле модели не определено иначе Вы строите путь к img файлу "вручную" в фильтре ... который не указывает на media/...
img = host[0] + "://" + host[1] + img