2017-01-04 32 views
6

Yönetici sayfasından bir resim yükleyebilirim, ancak django tarafından oluşturulan URL'ye gittiğimde resim bulunamıyor. (404 hatası) dosya klasörüne yüklenen ediliyor: Birden fazla çözüm denedi ama hiçbiri benim durum için çalışmıyor gibi görünüyorYerel Django ortamında ortam dosyalarını nasıl sunabilirim?

project_root/media/eventbanner/1/ 

. Django 1.10, Ubuntu 16.04'te yerel olarak çalıştırılıyor.

alıyorum url geçerli:

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

url.py kodu: HTML dosyasında

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

Kodu:

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

Medya kök klasör bulunur

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) 

cevap

11

burada asıl sorun bu url http://localhost:8000/media/eventbanner/1/banner_image.jpg ve diskin /home/username/xxx/xxx/project_name/media bu konum arasında hiçbir ilişki olmamasıdır. Eğer Media içeriği depolamak istediğiniz bir web sunucusu olurdu bir üretim uygulamasında

, sunma URL'si MEDIA_ROOT olacağını ve geçerli bir görüntü yolunu almak için bu değere ImageField.url eklemek istiyorum.

Burada ihtiyacınız olan şey, ortam görüntüleriniz için bir web sunucusu kurmaktır. İlk başta ... Sen medya dosyalarını yerel olarak hizmet olması yapmanız gereken bazı işler var

Serving Files in Development

o işin bir sürü gibi geliyor ama Django kısayol sağlar. Bu

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

Bu views.serve bit kullanır ve yalnızca DEBUG modunda kullanılması gerektiğini ... senin urls.py bazı değişiklikler gerektirir. Medya dosyalarının yolunu geçersiz kılar (django'nun ImageField gibi kullanıcı tarafından yüklenen yoruma ilişkin terimi). Bu, bu istekleri serve görünümünden yönlendirecektir. En iyisi, bu istek yollarını diskteki konumlara eşleyecek ve bu konumların HTTP URL'leri aracılığıyla erişilebilir olmasını sağlayan bir mini web sunucusu olduğunu söyleyebilirim.

+1

Bunu ekleyerek ROOT urls.py hile yaptı. Teşekkür ederiz. – MarkerDave