web-dev-qa-db-ja.com

ローカルDjango環境でメディアファイルを提供するにはどうすればよいですか?

管理ページから画像をアップロードできますが、Djangoによって生成されたURLに移動すると画像が見つかりません。 (404エラー)ファイルはフォルダーにアップロードされています:

project_root/media/eventbanner/1/

私は複数の解決策を試しましたが、私の状況ではうまくいかないようです。 Django 1.10はUbuntu16.04でローカルに実行されています。

私が取得するURLは次のとおりです。

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)

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

ここでの本当の問題は、この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はショートカットを提供します...

開発中のファイルの提供

メディアファイルをローカルで提供するために必要な作業がいくつかあります。 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モードでのみ使用する必要があります。メディアファイルへのパスをオーバーライドします(ImageFieldのようなユーザーがアップロードしたコンテンツに対するDjangoの用語)。これにより、これらのリクエストはserveビューを介してリダイレクトされます。これは、これらの要求ルートをディスク上の場所にマップし、HTTPURLを介してそれらの場所に到達できるようにするミニWebサーバーであることがわかります。

18
nsfyn55