2017-01-04 11 views
6

管理ページから画像をアップロードできますが、djangoが生成したURLに移動すると画像が見つかりません。 (404エラー) ファイルがフォルダにアップロードされている:私は複数のソリューションを試してみましたが、どれも私の状況のた​​めに働くように見えるんローカルのDjango環境でメディアファイルをどのように提供しますか?

project_root/media/eventbanner/1/ 

。 Django 1.10はUbuntu 16.04でローカルに実行されています。

私が手URLは次のとおりです。

<div class="banner-image"> 
    <img src="{{ event.eventbanner.banner_image.url }}"/> 
</div> 

url.pyコード:HTMLファイルに

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

コード:

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

メディアのルートフォルダは次の場所にあります。

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) 

答えて

11

ここでの本当の問題は、このURL http://localhost:8000/media/eventbanner/1/banner_image.jpgとディスク/home/username/xxx/xxx/project_name/media上のこの場所の間に関係がないということです。

Mediaコンテンツを保存するWebサーバーがある場合、配信URLはMEDIA_ROOTになり、有効な画像パスを取得するにはこの値にImageField.urlを追加します。

ここで必要なのは、メディアイメージ用のWebサーバーをセットアップすることです。最初にあなたがメディアファイルがローカルに務め持って行う必要があるいくつかの仕事を持っていることは、多くの作業のように聞こえるが、Djangoはショートカットを提供しています...

Serving Files in Development

。それは

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モードで使用する必要があります...あなたのurls.pyにいくつかの変更を必要とします。これは、メディアファイルへのパスを上書きします(djangoのユーザからのコメントには、ImageFieldのようなコメントが付けられています)。これにより、serveビューを介してこれらのリクエストがリダイレクトされます。私は、これがミニルートのWebサーバーで、リクエストルートをディスク上の場所にマップし、HTTP URL経由でそれらの場所に到達できるようにすることができます。

+1

これをROOT urls.pyに追加すると、そのトリックが実行されました。 ありがとうございます。 – MarkerDave

関連する問題