Как получить изображение из модели Product_image на домашню страницу в django?

Разрабатываю интернет магазин сайт. На моей домашней странице отображаются карточки продуктов, как вы видите на изображении.home.html

Это изображение продукта (фото телефона) на каждой карточке, которую я беру из своей модели Product (field image). Когда я навожу курсор на это изображение (hover over) на домашней странице, изображение меняется на другое. Поэтому мне нужно другое изображение, и я хочу взять следующее изображение (отображаемое при hover over) из моей модели Product_images. Но я не знаю, как это сделать. Пожалуйста, помогите мне.

urls.py

from django.urls import path
from . import views
from django.conf.urls.static import static

urlpatterns = 
    path('', views.home_page, name='amd-home'),
    path('product/<int:id>/', views.product_detail, name='product-detail'),
    path('about/', views.about, name='amd-about'),
]

views.py

from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView
from django.http import HttpResponse
from .models import Product, Product_image, Product_details

def home_page(request):
    products = Product.objects.all()
    images = Product_image.objects.all()
    context = {'products':products, 'images':images}
    return render(request, 'product/home.html', context)

models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Category(models.Model):
    name = models.CharField(max_length=200)
    parent_id = models.IntegerField(default=0)
    description = models.TextField()
    image = models.ImageField(upload_to='uploads/')

    def __str__(self):
        return f'{self.name}'

class Brand(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=400)
    image = models.ImageField(upload_to='uploads/')

    def __str__(self):
        return f'{self.name}'

class Product(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(upload_to='uploads/', blank=True, null=True)
    sku = models.CharField(max_length=200)
    price = models.IntegerField(default=0)
    price_old = models.IntegerField(default=0)
    description = models.TextField()
    status = models.BooleanField(default=False)
    date_posted = models.DateTimeField(auto_now_add=True)
    internal_storage = models.CharField(max_length=50, blank=True, null=True, default=None)
    ram = models.CharField(max_length=50, blank=True, null=True, default=None)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.title}, {self.description}'

class Product_image(models.Model):
    image = models.ImageField(upload_to='uploads/')
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.product.title} image'

home.html это очень большой файл, поэтому я вставляю только элемент, в котором я получаю изображение из модели Product (это код отлично работает, мой файл settings.py в порядке), но я не знаю, как написать код для получения изображения из моей модели Product_image.

{% for product in products %}
 <a href="{% url 'product-detail' product.id %}"><img alt="" src="{{ product.image.url }}"></a>
{% endfor %}

Ответы (1 шт):

Автор решения: Andrey Maslov

добавь к модели метод

def get_last_image(self):
   try:
       last_image = self.product_image_set.last().image
   except AttributeError:
       last_image = self.image 

и в шаблоне используй {{ product.get_last_image_url }}.

Вместо получения последнего изображения получай то, которое нужно для отображения.

И еще я бы во все ForeignKey добавлял related_name, например:

     product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='images')

тогда вместо self.product_image_set.last().image можно использовать self.images.last().image в итоге метод будет таким:

class Product(models.Model):
...
    def get_last_image(self):
        try:
            last_image = self.images.last().image
        except AttributeError:
            last_image = self.image 
...   

п.с.: Отвечаю на вопросы из коммента

Метод который вы написали именно к кокому модели должен добавить?

в модель Product (добавил в ответе как будет выглядеть метод в модели, после того как Вы пропишете related_name).

Я этот метод добавил и в модел Product и в модел Product_image и в темплате написал как Вы написали но не смог взять image с Product_image модели.

Вы уверены, что в Product_image есть данные для каждого элемента в product?

И когда вы написали "Вместо получения последнего изображения получай то, которое нужно", это как сделать? Чтобы получить именно тот который мне нужен в модели Product_image? Смотрите у Ваc в Product_image идет ForeignKey на Product, значит для каждого продукта у Вас может быть несколько изображений. Я же не знаю какое именно изображение Вы хотите показывать при наведении мышкой - первое, второе, последнее, или вообще как-то плясать от имени файла. Я Вам показал как получить последнее изображение из этого списка, если Вам нужно не последнее а какое-то другое, то получите именно его. Т.е. вместо .last() используйте .get(условие_для_поиска) Ничего не должен изменять в views.py файле?

нет

→ Ссылка