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)