Шаблон указывает неправильный путь к каталогу мультимедиа, и Django не может найти изображения

#python #html #django #twitter-bootstrap #bootstrap-4

#python #HTML #django #twitter-bootstrap #bootstrap-4

Вопрос:

У меня есть 2 модели и их взаимосвязь, это OneToMany. Итак, один «imovel» (португальское слово для свойства) содержит много изображений («fotos» или «imagens» на португальском языке).

Структура моего веб-приложения очень проста, и я настроил ее в настройках:

settings.py

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

urls.py

 urlpatterns = [
    path('', index, name='index'),
    path('sobre_nos/', sobre_nos, name='sobre_nos'),
    path('', include('imoveis.urls')),
    path('admin/', admin.site.urls),
]   static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

  

Таким образом, каждое загруженное изображение переходит непосредственно в структуру «медиа», а изображения для свойств переходят к 'media/imoveis/%Y/%m/%d' .

Я хочу показать все изображения, связанные со свойством в шаблоне, используя базовую карусель начальной загрузки:

imovel.html

   <div id="carouselExampleControls" class="carousel slide" data-ride="carousel">
    <div class="carousel-inner">
      {% for foto in fotos_do_imovel %}
      {% if foto.imagem %}
      <div class="carousel-item activate">
        <img class="d-block w-100" src="{{ foto.imagem }}">
      </div>
      {% else %}
       <div class="carousel-item">
         <img class="d-block w-100" src="{{ imovel.foto_principal }}">
       </div>
      {% endif %} 
    </div>
    {% endfor %}
    <a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev">
      <span class="carousel-control-prev-icon" aria-hidden="true"></span>
      <span class="sr-only">Anterior</span>
    </a>
    <a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next">
      <span class="carousel-control-next-icon" aria-hidden="true"></span>
      <span class="sr-only">Proxima</span>
    </a>
  </div>
  

Проблема в том, что когда я захожу на страницу imovel.html , изображения не найдены:

 imoveis/2020/10/01/pexels-photo-1571463.jpeg
imoveis/2020/10/01/pexels-photo-1643383.jpeg
[01/Oct/2020 21:20:35] "GET /imovel/3 HTTP/1.1" 200 5952
Not Found: /imovel/imoveis/2020/10/01/pexels-photo-1643383.jpeg
Not Found: /imovel/imoveis/2020/10/01/pexels-photo-1571463.jpeg
[01/Oct/2020 21:20:35] "GET /imovel/imoveis/2020/10/01/pexels-photo-1571463.jpeg HTTP/1.1" 404 3187
[01/Oct/2020 21:20:35] "GET /imovel/imoveis/2020/10/01/pexels-photo-1643383.jpeg HTTP/1.1" 404 3187
  

Я напечатал пути к изображениям внутри представления, чтобы проверить, все ли там в порядке, и представление отправляет правильный путь, и я не знаю, где это imovel/ добавляется к началу правильного пути, а также я не знаю, как это исправить.

(Английский не мой родной язык, поэтому я прошу прощения за несколько ошибок)

Ответ №1:

Для FileField или ImageField вы должны использовать .url атрибут [Django-doc] файла:

 <img class="d-block w-100" src="{{ foto.imagem.url }}">  

Примечание: Django не обслуживает статические и мультимедийные файлы в рабочей среде. В процессе производства
вам нужно будет настроить веб-сервер, такой как Apache или Nginx. В документации Django
есть разделы по настройке веб-серверов.