В шаблоне django не отображаются фото на главной странице

Рейтинг: 0Ответов: 1Опубликовано: 22.03.2023

Не могу сделать в шаблоне чтобы отображались фотографии на главной странице. В карточках товаров все работает прекрасно. Но с главной страницей беда.

models.py

class Dress(models.Model):
    title = models.CharField(max_length=150, verbose_name="Название модели")
    slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name="URL")
    color = models.CharField(max_length=150, verbose_name="Цвет")
    textile = models.TextField(max_length=255, verbose_name="Ткань")
    size = models.CharField(max_length=150, verbose_name="Размер")
    price = models.CharField(max_length=150, verbose_name="Цена")
    availability = models.CharField(max_length=50, verbose_name="Наличие")
    is_published = models.BooleanField(default=True, verbose_name="Публикация")
    cat = models.ForeignKey('Category', on_delete=models.PROTECT, verbose_name="Категория")

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('look_dress', kwargs={'dress_slug': self.slug})

    class Meta:
        verbose_name = 'Свадебные платья'
        verbose_name_plural = 'Свадебные платья'
        ordering = ['title', 'price']

class Category(models.Model):
    name = models.CharField(max_length=100, db_index=True, verbose_name="Категория")
    slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name="URL")

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('category', kwargs={'cat_slug': self.slug})

    class Meta:
        verbose_name = 'Категория свадебных платьев'
        verbose_name_plural = 'Категории свадебных платьев'
        ordering = ['id', 'name']

class DressImage(models.Model):
    title = models.CharField(max_length=150, verbose_name="Название модели")
    photo = models.ImageField(upload_to="photos/%Y/%m/%d", verbose_name="Фотография")
    dress_photo = models.ForeignKey(Dress, on_delete=models.CASCADE, related_name='photo', verbose_name='Синхронизация')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Добавление св.фотографии'
        verbose_name_plural = 'Добавление св.фотографий'
        ordering = ['id']

views.py

def index(request):
    dresses = Dress.objects.all()

    context = {'menu': menu,
               'dresses': dresses,
               'title': 'Главная',
               'cat_selected': 0,
               }
    return render(request, 'dress/index.html', context=context)

def category(request, cat_slug):
    cat = Category.objects.filter(slug=cat_slug)
    dresses = Dress.objects.filter(cat_id=cat[0].id)
    dress_photo = Dress.objects.all()

    if len(dresses) == 0:
        raise Http404()

    context = {'menu': menu,
               'dresses': dresses,
               'dress_photo': dress_photo,
               'title': f'Категория: {cat[0].name}',
               'cat_selected': cat[0].id,
               }
    return render(request, 'dress/index.html', context=context)

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('dress.urls')),
]

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

handler404 = pageNotFound

settings.py

DEBUG = True

ALLOWED_HOSTS = ['127.0.0.1']

STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = []

# Default primary key field type
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

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

index.html

{% extends 'dress/base.html' %}

{% block content %}
<ul class="list-articles">
    {% for d in dresses %}
        <li><div class="article-panel">
        <p class="first">Категория: {{ d.cat }}</p></div>
        {% for p in dresses.photo.all %}
            {% if p.photo %}
                <p><img class="img article-left-thumb" src="{{ p.photo.url }}" style="margin-right: 15px;padding-right: 5px;padding-top: 5px;padding-left: 5px;padding-bottom: 5px;"></p>
            {% endif %}
        {% endfor %}
            <h2>{{ d.title }}</h2>
            <p>Цвет: {{ d.color }}</p>
            <p>Состав: {{ d.textile }}</p>
            <p>Размер: {{ d.size }}</p>
            <p>Цена: <b>{{ d.price }}</b> руб.</p>
            <p>Наличие: <b>{{ d.availability }}</b></p>
            <div class="clear"></div>
            <p class="link-read-post"><a href="{{ d.get_absolute_url }}" style="padding-left: 720px;padding-right: 720px;border-top-width: 0px;border-top-style: solid;border-bottom-width: 0px;border-bottom-style: solid;border-right-width: 0px;border-right-style: solid;border-left-width: 0px;border-left-style: solid;">Посмотреть</a> </p>
        </li>
    {% endfor %}
</ul>
{% endblock %}

Ответы

▲ 0

вместо етого кода в шаблоне index.html:

{% for p in dresses.photo.all %}
    {% if p.photo %}
        <p><img class="img article-left-thumb" src="{{ p.photo.url }}" style="margin-right: 15px;padding-right: 5px;padding-top: 5px;padding-left: 5px;padding-bottom: 5px;"></p>
    {% endif %}
{% endfor %}

тебе нужно написать:

{% if d.photo %}
    {% for p in d.photo.all %}
        <p><img class="img article-left-thumb" src="{{ p.photo.url }}" style="margin-right: 15px;padding-right: 5px;padding-top: 5px;padding-left: 5px;padding-bottom: 5px;"></p>
    {% endfor %}
{% endif %}

так как тебе же нужно брать фотографии для каждого платья отдельно.

а также если хочешь то в модели DressImage в поле внешнего ключа напиши related_name='photos', так как к 1 платью может бить привязано много фотографий и соответственно имя должно бить множественное.И если ти изменишь ето имя то тогда нужно в сотвтсвенном коде вместо photo написать photos.

а также посоветую пользоватса чатом gpt.