Django - Изображения не отображаются в шаблоне.но URL изображения появился.Urls.py Проблема? - PullRequest
0 голосов
/ 07 февраля 2019

Использование Django 2.1.5 + Bootstrap 4.2 и некоторых иконок из fontawesome

Здравствуйте, после долгого поиска я решил опубликовать, потому что большинство ответов связано со старыми версиями Django.Я относительно новичок в Django, и мне нравится тестировать все представления функций / классов и поля моделей.Теперь я хотел проверить, как я могу отображать изображения, связанные с моей базой данных, в моем шаблоне.Но, к сожалению, изображения не хотят отображаться, все, что я вижу, это значок заполнителя изображения.

Я создал приложение и 2 простые модели с музыкантами (с изображениями) и автомобилями.Загрузка через администратор работает, а пустой URL-адрес доступен в шаблоне через {{modelone.person_pic}}

РЕШЕННЫЕ ПРОБЛЕМЫ - см. Ниже

aquaman / models.py

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    person_pic = models.ImageField(upload_to='artist/', max_length=255, null=True, blank=True )

def __str__(self):
    return "{} - {}".format(self.first_name[:25], self.last_name[:25])

class Data_Sheet(models.Model):
    car = models.CharField(max_length=30)
    color = models.CharField(max_length=30)

    def __str__(self):
    return "{} - {}".format(self.car[:25], self.color[:25])

views.py

from django.shortcuts import get_object_or_404, render, redirect
from django.utils import timezone
from django.views.generic.list import ListView
from django.views.generic import TemplateView


from .models import Person, Data_Sheet

<…some other views…>

class ArtistView4(TemplateView):

template_name = 'aquaman/artistview4.html'


def get_context_data(self, **kwargs):
    context = super(ArtistView4, self).get_context_data(**kwargs)
    context['modelone'] = Person.objects.all()
    context['modeltwo'] = Data_Sheet.objects.all()
    return context

artistview4.html

{% extends 'base.html' %}

{% load static %}


{% block custom_css %}
<link rel="stylesheet" type="text/css" href="{% static 'css/clear_styles.css' %}">
{% endblock %}


{% block content %}


{% for visual in modelone %}

<div align="center">
<h4 class="">{{ visual.first_name }}</h4>
<h4 class="">{{ visual.last_name }}</h4>
<h4 class="">{{ visual.person_pic }}</h4> <!-- to check if url is displayed --> 
</div>

<img src="{{ visual.person_pic.url }}">

</div>
{% endfor %}

{% endblock %}

urls.py

from django.urls import path

from . import views
from .views import AquaListView, AquaListView2, AquaListView3, ArtistView4

app_name='aquaman'

urlpatterns = [
    path('home/', views.aqua_home, name='aqua_home'),
    path('aqua_listview/', AquaListView.as_view(), name='aqua_listview'),
    path('aqua_listview2/', AquaListView2.as_view(), name='aqua_listview2'),
    path('aqua_listview3/', AquaListView3.as_view(), name='aqua_listview3'),
    path('arstistview4/', ArtistView4.as_view(), name='artistview4'),
]

мой подход

Насколько я понимаю документацию.Я должен добавить эти строки в urls.py в urlpattern, чтобы все было направлено.

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Так что мой urls.py теперь выглядит так

from django.urls import path

from django.conf import settings
from django.conf.urls.static import static

from . import views
from .views import AquaListView, AquaListView2, AquaListView3, ArtistView4

app_name='aquaman'

urlpatterns = [
    path('home/', views.aqua_home, name='aqua_home'),
    path('aqua_listview/', AquaListView.as_view(), name='aqua_listview'),
    path('aqua_listview2/', AquaListView2.as_view(), name='aqua_listview2'),
    path('aqua_listview3/', AquaListView3.as_view(), name='aqua_listview3'),
    path('arstistview4/', ArtistView4.as_view(), name='artistview4'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Это то, что я добавилв моем settings.py

TEMPLATES = [
    {
<…>
 'django.template.context_processors.media',
<…>
    },
]


STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
    '/var/www/static/',
]

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

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

Django Server #

Not Found: /media/artist/freddy_mercury.jpg
Not Found: /media/artist/kurt_cobain.jpg
Not Found: /media/artist/ella_fitzgerald.PNG
Not Found: /media/artist/amy_winehouse.PNG
[07/Feb/2019 18:42:49] "GET /media/artist/ella_fitzgerald.PNG HTTP/1.1" 404 2257

Когда я загружаюизображение через администратора с моего рабочего стола Django автоматически сохраняет изображения в MyProject / media / artist> , но в то же время django не может найти эти изображения?

Если перейти непосредственно к изображениям через http://127.0.0.1:8000/media/artist/kurt_cobain.jpg например, django показывает мне это:

The current path, media/artist/kurt_cobain.jpg, didn't match any of these.

Несмотря на то, что django поместил изображение через загрузку в папку BaseDir / media / artist .

Может быть, я пропустил "Обслуживание файлов в разработке", также известное как , если настройки. ОТЛАДКА: https://docs.djangoproject.com/en/2.1/ref/views/

Но когда я добавляю это, ничего не происходит.

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

Проблема решена

Хорошо, я кое-что неправильно понял в Документах, может быть, это не так очевидно.

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Это следует добавить в "MainApp / urls.py" , а не в "MyOtherApps / urls.py" .Я подумал только потому, что мне нужны только изображения в определенном приложении, я должен добавить эти строки в это конкретное приложение urls.py.

Rock On & Peace

...