Проблема с поиском медиафайла с помощью статической функции Django в шаблоне

#python #django #django-templates

Вопрос:

Я использую Django 3.2

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

Структура каталогов статических ресурсов приложения для блога

 blog/static/blog/
├── css
│   ├── bona
│   │   ├── comment.css
│   │   ├── detail-page.css
│   │   ├── prism.css
│   │   ├── responsive.css
│   │   ├── styles
│   │   └── styles.css
│   ├── common-css
│   │   ├── bootstrap.css
│   │   ├── fontawesome-free
│   │   ├── ionicons.css
│   │   ├── ionicons.min.css
│   │   └── swiper.css
│   └── tinymce
│       ├── github.css
│       └── tomorrow-night-blue.css
├── font
│   ├── fontello.eot
│   ├── fontello.svg
│   ├── fontello.ttf
│   ├── fontello.woff
│   └── fontello.woff2
├── fonts
│   ├── Aileron
│   │   ├── Aileron-Black.otf
│   │   ├── Aileron-Bold.otf
│   │   ├── Aileron-Heavy.otf
│   │   ├── Aileron-Italic.otf
│   │   ├── Aileron-Light.otf
│   │   ├── Aileron-Regular.otf
│   │   ├── Aileron-SemiBold.otf
│   │   ├── Aileron-Thin.otf
│   │   ├── Aileron-UltraLight.otf
│   │   └── Gidole-Regular.ttf
│   ├── Colaborate
│   │   ├── ColabBol.otf
│   │   ├── ColabLig.otf
│   │   ├── ColabMed.otf
│   │   ├── ColabReg.otf
│   │   └── ColabThi.otf
│   ├── ionicons.eot
│   ├── ionicons.svg
│   ├── ionicons.ttf
│   ├── ionicons.woff
│   ├── linea-basic-10.eot
│   ├── linea-basic-10.svg
│   ├── linea-basic-10.ttf
│   ├── linea-basic-10.woff
│   ├── Material-Design-Iconic-Font.eot
│   ├── Material-Design-Iconic-Font.svg
│   ├── Material-Design-Iconic-Font.ttf
│   ├── Material-Design-Iconic-Font.woff
│   ├── Material-Design-Iconic-Font.woff2
│   ├── Roboto
│   │   ├── LICENSE.txt
│   │   ├── Roboto-BlackItalic.ttf
│   │   ├── Roboto-Black.ttf
│   │   ├── Roboto-BoldItalic.ttf
│   │   ├── Roboto-Bold.ttf
│   │   ├── Roboto-Italic.ttf
│   │   ├── Roboto-LightItalic.ttf
│   │   ├── Roboto-Light.ttf
│   │   ├── Roboto-MediumItalic.ttf
│   │   ├── Roboto-Medium.ttf
│   │   ├── Roboto-Regular.ttf
│   │   ├── Roboto-ThinItalic.ttf
│   │   └── Roboto-Thin.ttf
│   ├── Roboto_Condensed
│   │   ├── LICENSE.txt
│   │   ├── RobotoCondensed-BoldItalic.ttf
│   │   ├── RobotoCondensed-Bold.ttf
│   │   ├── RobotoCondensed-Italic.ttf
│   │   ├── RobotoCondensed-LightItalic.ttf
│   │   ├── RobotoCondensed-Light.ttf
│   │   └── RobotoCondensed-Regular.ttf
│   └── Spirequal-Light
│       └── Spirequal-Light.TTF
├── images
│   ├── authors_banner2.png
│   ├── authors_banner.png
│   ├── banner.jpeg
│   ├── blog-1-1000x600.jpg
│   ├── category-1-400x250.jpg
│   ├── category-3-400x250.jpg
│   ├── favicon.png
│   ├── logo.png
│   ├── marion-michele-330691.jpg
│   ├── media
│   │   ├── article-default.jpg
│   │   ├── banner
│   │   ├── category-default.jpg
│   │   ├── profile-pic-default.jpg
│   │   └── slider-1.jpg
│   ├── pexels-photo-370474.jpeg
│   ├── slider-1-1600x900.jpg
│   └── slider-1.jpg
└── js
    ├── blog
    │   ├── blog.js
    │   ├── highlight.pack.js
    │   └── prism.js
    ├── bootstrap
    │   └── bootstrap.bundle.min.js
    └── common-js
        ├── bootstrap.js
        ├── jquery-3.1.1.min.js
        ├── scripts.js
        ├── swiper.js
        └── tether.min.js
 

Фрагмент шаблона

 <img alt="author-profile-image" src="{% static author_profile_details.profile.image.url %}" class="rounded-circle border border-dark shadow-sm">
 

Изображение src выше разрешено для пути: /static/media/profile-pic-default.jpg

Но (как видно из приведенного выше пути к каталогу) правильный путь должен быть: static/media/blog/images/media/profile-pic-default.jpg (Я думаю, что я не совсем понял, как развертывать статические файлы).

Мой вопрос заключается в следующем: учитывая структуру каталогов статических ресурсов приложения для блога, как мне использовать static их для правильного поиска profile-pic-default.jpg ?

Комментарии:

1. {{ static author_profile_details.profile.image.url }} ?

2. @WillemVanOnsem, который решает тот же путь, что и выше — Django, похоже, игнорирует пространство имен приложений

3. «Медиафайлы» != «Статические файлы». Статические файлы-это статические ресурсы ваших веб-сайтов (логотипы, изображения, css и т.д.). Медиафайлы-это загруженный пользователем контент . Следовательно, вам нужно только написать {{ author_profile_details.profile.image.url }} (если вы пишете это правильно и ваши настройки мультимедиа правильные).

Ответ №1:

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

В этом случае правильный способ закодировать его в шаблоне-это:

 {% if author_profile_details.profile.image %}
<img
    alt="author-profile-image"
    src="{{ author_profile_details.profile.image.url }}"
    class="rounded-circle border border-dark shadow-sm">
>
{% else %}
<img
    alt="author-profile-image"
    src="{% static 'blog/images/media/profile-pic-default.jpg' %}"
    class="rounded-circle border border-dark shadow-sm">
>
{% endif %}
 

Комментарии:

1. Ваши рассуждения кажутся здравыми … Я изучаю свой код, чтобы получить более четкое представление о том, что происходит, прежде чем принять ваш ответ — если это поможет решить проблему. Спасибо