Django: Метод для получения url изображений

В настоящее время я работаю над веб-сайтом и хотел бы перейти от класса Product, содержащего изображения, к следующему:

models.py:

class Product(models.Model):
    name    = models.CharField(max_length=60)
    price   = models.DecimalField(max_digits=10, decimal_places=2)
    
    # Digital Products do not need shipping
    digital = models.BooleanField(default=False, null=True, blank=False)
    # now being handled in ProductImage:
    # image   = models.ImageField(null=True, blank=True)

    @property
    def imageURL(self):
        try:
            url = self.image.url
        # get placeholder if something does not work
        except: 
            url = '/images/placeholder.png'
        return url
    

class ProductImage(models.Model):
    
    product     = models.ForeignKey(Product, related_name="images", on_delete=models.SET_DEFAULT, default=None, null=True)
    image1      = models.ImageField(null=True, blank=True)
    image2      = models.ImageField(null=True, blank=True)
    image3      = models.ImageField(null=True, blank=True)
    image4      = models.ImageField(null=True, blank=True)
    image5      = models.ImageField(null=True, blank=True)
    image6      = models.ImageField(null=True, blank=True)

я использовал для получения url одного изображения (что работает нормально, если изображение является атрибутом Product) следующим образом:

view.html:

{% for product in products %}    
    <img class="thumbnail" src="{{ product.imageURL }}">
{% endfor %}

view.py:

def store_view(request):
    # some code
    "product":Product.objects.all()
    context.update({"products":products})
    return render(request, "view.html", context)

Есть ли способ получить изображения через отношение ForeignKey? (Например, путем модификации вышеуказанного метода imageURL)?

Я пробовал:

models.py:

class Product(models.Model)
    # same as above
    
    @property
    def imageURL(self):
        try:
            url = self.images.image1.url
        # get placeholder if something does not work
        except:
            url = '/images/placeholder.png'
        return url

но это вызывает ошибку AttributeError: 'RelatedManager' object has no attribute 'image1'. Другие возможные решения также приветствуются.

Так происходит потому, что self.images возвращает набор объектов ProductImage. Даже если он всего один, у вас будет QuerySet объект с одним ProductImage объектом, например:

<QuerySet [<ProductImage object (1)>]>

Вы можете изменить отношение на OneToOneField, если не планируете иметь больше связанных ProductImage объектов с Product. Тогда вы можете связывать просто, как вы уже пробовали:

class ProductImage(models.Model):
    
    product     = models.OneToOneField(Product, related_name="images", on_delete=models.SET_DEFAULT, default=None, null=True)
    image1      = models.ImageField(null=True, blank=True)
    ...

в urls.py

urlpatterns = [

...

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Вернуться на верх