[英]How do I serve media files in a local Django environment?
我可以通過管理頁面上傳圖片,但是當我導航到 django 生成的 url 時找不到圖片。 (404錯誤)文件正在上傳到文件夾:
project_root/media/eventbanner/1/
我嘗試了多種解決方案,但似乎沒有一個適合我的情況。 Django 1.10 在 Ubuntu 16.04 上本地運行。
我得到的網址是:
http://localhost:8000/media/eventbanner/1/banner_image.jpg
媒體根文件夾位於:
/home/username/xxx/xxx/project_name/media
HTML 文件中的代碼:
<div class="banner-image">
<img src="{{ event.eventbanner.banner_image.url }}"/>
</div>
url.py 代碼:
from django.conf.urls import url, include
from django.contrib import admin
from . import views
from django.conf import settings
from django.conf.urls.static import static
app_name = 'events'
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^details/(?P<event_id>[0-9]+)/$', views.details, name='details'),
url(r'^details/(?P<event_id>[0-9]+)/addcomment/$', views.add_comment, name='add_comment'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
設置.py
STATIC_URL = '/static/'
STATICFILES_DIRS =[os.path.join(BASE_DIR, 'static'),]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
模型.py
def validate_only_one_instance(obj):
model = obj.__class__
if (model.objects.count() > 0 and obj.id != model.objects.get().id):
raise ValidationError("Can only create 1 %s instance" % model.__name__)
class EventBanner(models.Model):
event = models.OneToOneField(Event, unique=True)
banner_image = models.ImageField(upload_to=get_image_path, blank=True, null=True)
def clean(self):
validate_only_one_instance(self)
這里真正的問題是這個 url http://localhost:8000/media/eventbanner/1/banner_image.jpg
和磁盤上的這個位置之間沒有關系/home/username/xxx/xxx/project_name/media
。
在生產應用程序中,您有一個 Web 服務器用於存儲Media
內容,服務 URL 將是MEDIA_ROOT
並且您將ImageField.url
附加到此值以獲得有效的圖像路徑。
您需要在這里為您的媒體圖像設置一個網絡服務器。 起初這聽起來像是很多工作,但 Django 提供了一個快捷方式......
您需要做一些工作才能在本地提供媒體文件。 它需要對您的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,
}),
]
這使用views.serve
位並且應該只在DEBUG
模式下使用。 它覆蓋了媒體文件的路徑(django 的用戶上傳內容的術語,如ImageField
)。 這將通過serve
視圖重定向這些請求。 我能說的最好的是這是一個迷你 Web 服務器,它將這些請求路由映射到磁盤上的位置,並允許通過 HTTP url 訪問這些位置。
至少從 Django 1.8 開始,有一個輔助函數static()
可以為您設置並確保它僅在調試模式下運行。
你的urls.py
應該是這樣的:
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
...簡單地引用文檔。
確保您的MEDIA_URL
設置為像/media/
這樣的相對路徑,並且您的MEDIA_ROOT
是像/home/foo/project/media
這樣的絕對文件系統路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.