2017-01-04 5 views
6

मैं व्यवस्थापक पृष्ठ के माध्यम से एक छवि अपलोड कर सकता हूं, लेकिन जब मैं django द्वारा उत्पन्न यूआरएल पर नेविगेट करता हूं तो छवि नहीं मिल सकती है। (404 त्रुटि) फ़ाइलें फ़ोल्डर में अपलोड किया जा रहा है:मैं स्थानीय Django पर्यावरण में मीडिया फ़ाइलों की सेवा कैसे करूं?

project_root/media/eventbanner/1/ 

मैं कई समाधान की कोशिश की है, लेकिन कोई भी मेरी स्थिति के लिए काम करने के लिए लग रहे हैं। Django 1.10 उबंटू 16.04 पर स्थानीय चलाया जा रहा है।

यूआरएल मैं मिलता है:

<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

यहाँ वास्तविक समस्या इस यूआरएल http://localhost:8000/media/eventbanner/1/banner_image.jpg और डिस्क /home/username/xxx/xxx/project_name/media पर इस स्थान के बीच कोई रिश्ता है कि वहाँ है।

एक उत्पादन आवेदन आप एक वेब सर्वर जहाँ आप अपने Media सामग्री को एकत्र होता होगा में, की सेवा यूआरएल MEDIA_ROOT हो सकता है और आप इस मान को ImageField.url संलग्न एक वैध छवि पथ प्राप्त करने के लिए चाहते हैं।

आपको अपनी मीडिया छवियों के लिए वेब सर्वर सेट अप करने की आवश्यकता है। सबसे पहले कि बहुत काम की तरह

Serving Files in Development

आप कुछ काम आप मीडिया फ़ाइलों को स्थानीय स्तर पर कार्य किया है करने के लिए क्या करने की जरूरत है लगता है, लेकिन 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 दृश्य के माध्यम से रीडायरेक्ट करेगा। सबसे अच्छा मैं यह बता सकता हूं कि यह एक मिनी वेब सर्वर है जो उन अनुरोध मार्गों को डिस्क पर स्थानों पर मैप करेगा और उन स्थानों को HTTP यूआरएल के माध्यम से पहुंचने की अनुमति देगा।

+1

इसे रूट में जोड़कर urls.py ने चाल की है। धन्यवाद। – MarkerDave

संबंधित मुद्दे