27👍
The real problem here is that there is no relationship between this url http://localhost:8000/media/eventbanner/1/banner_image.jpg
and this location on disk /home/username/xxx/xxx/project_name/media
.
In a production application you’d have a web server where you’d store your Media
content, the serving URL would be MEDIA_ROOT
and you’d append ImageField.url
to this value to get a valid image path.
What you need here is to set up a web server for your media images. At first that sounds like a lot of work, but Django provides a shortcut…
You have some work you need to do to have the media files served locally. It requires some changes to your urls.py
…
from django.conf import settings
from django.views.static import serve
# ... the rest of your URLconf goes here ...
if settings.DEBUG:
urlpatterns += [
url(r'^media/(?P<path>.*)$', serve, {
'document_root': settings.MEDIA_ROOT,
}),
]
This uses the views.serve
bit and should only be used in DEBUG
mode. It overrides the path to media files(django’s term for user uploaded content like ImageField
). This will redirect those requests through the serve
view. Best I can tell this is a mini web server that will map those request routes to locations on disk and allow those locations to be reachable via HTTP urls.
9👍
As of at least Django 1.8, there is a helper function static()
that will set this up for you and ensure that it only functions in debug mode.
Your urls.py
should look something like this:
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
…to simply quote the documentation.
Make sure that your MEDIA_URL
is set to a relative path like /media/
and that your MEDIA_ROOT
is an absolute filesystem path like /home/foo/project/media
.