Как получить изображение из модели Product_image на домашню страницу в django?
Разрабатываю интернет магазин сайт. На моей домашней странице отображаются карточки продуктов, как вы видите на изображении.
Это изображение продукта (фото телефона) на каждой карточке, которую я беру из своей модели 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 шт):
добавь к модели метод
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 файле?
нет