Поле FilePathField для пути изображения не работает в панели администратора Django
Новичок в Django и веб-разработке в целом. Но я следовал учебнику для создания своего первого сайта. Все работало хорошо, пока я не закончил его и не захотел отредактировать информацию с помощью админ-панели Django.
Основная проблема заключается в том, что у меня есть модель, показанная ниже, которая использует FilePathField для описания расположения изображений. В учебнике я должен был разместить изображения в /home/pi/mysite/projects/static/img
.
from django.db import models
class Project(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
technology = models.CharField(max_length=20)
image = models.FilePathField('/img')
def __str__(self):
return self.title #or self.title for blog posts
Сначала это работало нормально для отображения изображений на сайте, но как только я пытался перейти к урлу /change/
из панели администратора, я получал FileNotFoundError at /admin/projects/project/1/change/ [Errno 2] No such file or directory: '/img'
Посмотрев вокруг, я обнаружил, что поле FilePathField является абсолютным путем, поэтому попробовал определить его абсолютно с помощью /home/pi/mysite/projects/static/img/
. Это остановило возникновение ошибки, что позволило мне, по крайней мере, получить доступ к урлу /change/
из панели администратора. В панели теперь отображалось поле изображения с выпадающим списком, который я мог использовать для выбора между различными изображениями, которые были расположены по адресу /home/pi/mysite/projects/static/img/
. Но из панели администратора, как только я нажимал кнопку сохранения, изображения больше не появлялись на сайте. При использовании элемента inspect на сайте, похоже, он пытался извлечь изображения из /static/projects/static/img
. Затем я попытался переместить изображения в /static/projects/static/img
, но после этого они больше не отображались в выпадающем окне в панели администратора, а также не отображались на сайте.
Так что на данный момент я просто немного запутался, где я должен указывать FilePathField, что позволит мне отображать изображения на сайте, а также изменять их через панель администратора.
Гораздо лучший подход - использовать FileField
от django следующим образом:
image = models.FileField(null=True, blank=True)
В вашем settings.py
необходимо включить путь к медиафайлу. Проверьте, есть ли он у вас в настройках.
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
MEDIA_URL = '/media/'
Последним шагом будет расширение urlpatterns в вашем urls.py:
urlpatterns = [
# your paths
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Это создаст каталог /media/
, на который будут указывать загруженные медиафайлы. Затем во фронтенде вы можете просто использовать свойство модели image.url
для получения абсолютного url изображения.