Поле 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 изображения.

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