Это может помочь, если вы также показали свои файлы settings.py и urls.py, но я предполагаю, что ваш сервер разработки не настроен для обслуживания этого файла personal/static/img/[image name]
.Чтобы настроить это, вам нужно настроить файлы settings.py и urls.py основного проекта.
settings.py:
# Add these
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = "/media/"
MEDIA_ROOT
указывает, гдефайлы могут быть обработаны с момента нажатия MEDIA_URL
(например, когда ваш браузер запрашивает эту картинку).Чтобы на самом деле обслуживать файлы, необходимые для настройки представления, есть встроенная вспомогательная функция для обслуживания этих файлов в процессе разработки, добавьте ее в свой основной файл проекта urls.py
urls.py:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# your other views
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Затем вам нужно просто загрузить изображение еще раз, оно будет сохранено в media/<upload_to>/<picturename>
, в вашем случае media/personal/static/img/<picture_name>
.И ваш сервер на самом деле будет знать, где его найти сейчас.
Посмотрите документацию , чтобы найти лучший пример.
PS
ЖесткийКодированный URL, который вы использовали, /static/img/[image name]
работал, потому что сервер разработки Django может по умолчанию обслуживать статические файлы из каталога static/
в корневом каталоге проекта, а также из любых папок static/
в корневых каталогах приложения.Так что это было какое-то счастливое совпадение, что ваш аргумент upload_to
в вашем ImageField создал эту папку /personal/static/
.Затем, поскольку в settings.py был установлен DEBUG = True
, вы настроили его автоматическое обслуживание.Это описано (лучше) в связанной документации выше.