2017-01-04 15 views
6

Tôi có thể tải lên hình ảnh qua trang quản trị, nhưng không thể tìm thấy hình ảnh khi tôi điều hướng đến url được tạo bởi django. (404 lỗi) Các tập tin đang được tải lên thư mục:Làm cách nào để phân phát các tệp phương tiện trong môi trường Django cục bộ?

project_root/media/eventbanner/1/ 

Tôi đã thử nhiều giải pháp nhưng không ai có vẻ làm việc cho hoàn cảnh của tôi. Django 1.10 đang được chạy cục bộ trên Ubuntu 16.04.

Url tôi nhận được là: thư mục gốc

http://localhost:8000/media/eventbanner/1/banner_image.jpg 

Truyền thông tọa lạc tại địa chỉ:

/home/username/xxx/xxx/project_name/media 

mã trong tệp HTML: Mã

<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) 

settings.py

STATIC_URL = '/static/' 
STATICFILES_DIRS =[os.path.join(BASE_DIR, 'static'),] 

MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') 
MEDIA_URL = '/media/' 

models.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) 

Trả lời

11

Vấn đề thực sự ở đây là không có mối quan hệ giữa url này http://localhost:8000/media/eventbanner/1/banner_image.jpg và vị trí này trên đĩa /home/username/xxx/xxx/project_name/media.

Trong ứng dụng sản xuất bạn có máy chủ web nơi bạn lưu trữ nội dung Media, URL phân phát sẽ là MEDIA_ROOT và bạn sẽ thêm ImageField.url vào giá trị này để có đường dẫn hình ảnh hợp lệ.

Điều bạn cần ở đây là thiết lập máy chủ web cho hình ảnh phương tiện của mình. Lúc đầu nghe có vẻ như rất nhiều công việc, nhưng Django cung cấp một phím tắt ...

Serving Files in Development

Bạn có một số công việc bạn cần phải làm gì để có các tập tin media phục vụ tại địa phương. Nó đòi hỏi một số thay đổi để urls.py của bạn ...

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, 
     }), 
    ] 

này sử dụng các bit views.serve và chỉ nên được sử dụng trong chế độ DEBUG. Nó ghi đè đường dẫn đến tệp phương tiện (thuật ngữ django cho nhận xét do người dùng tải lên như ImageField). Điều này sẽ chuyển hướng các yêu cầu đó thông qua chế độ xem serve. Tốt nhất tôi có thể nói đây là một máy chủ web mini sẽ ánh xạ các tuyến đường yêu cầu đó đến các vị trí trên đĩa và cho phép các vị trí đó có thể truy cập thông qua các url HTTP.

+1

Thêm điều đó vào ROOT.py ROOT.py. Cảm ơn bạn. – MarkerDave

Các vấn đề liên quan