Как отобразить изображения из базы данных строка за строкой
Я пытаюсь создать веб-страницу, на которой я отображаю изображения животных в виде галереи. Я бы хотел, чтобы в галерее изображения отображались рядом в ряд (3 изображения в ряд).
Я пробовал отображать изображения из базы данных (модели) бок о бок в строках, но как новичок я нахожу это довольно сложным и хотел бы получить помощь в этом.
Я кодирую с использованием фреймворка Django, где модель (животное) содержит следующие поля: Image_Title, Image_Description, Image_Price.
Я понимаю концепцию, где я должен зациклить объекты Animal, но у меня не получается поместить 3 объекта в ряд. Я могу разместить один в ряд, но это то, что я ищу.
Код для views.py
def gallery(request):
images = Animal.objects.all()
context = {
'images': images,
}
return render(request, 'AnimalGallery/gallery.html', context)
Код для модели животного:
class Animal(models.Model):
Image = models.ImageField()
Image_Title = models.CharField(max_length=50)
Image_Description = models.CharField(max_length=500, blank=True)
Image_Price = models.FloatField(null=True)
def __str__(self):
return self.Image_Title
Код для HTML (отображает одно изображение в строке):
<table>
{% for each in images %}
<tr>
<td>{{each.Image}} </td>
<td>{{each.Image_Title}} </td>
</tr>
{% endfor %}
</table>
Это веб-сайт, который реализовал ту же концепцию, которую я ищу (3 изображения в строке)
Изображения не включаются непосредственно в HTML, вместо этого передается url изображения для получения и отображения на стороне клиента.
Проблема в том, что вы пытаетесь передать изображение непосредственно в шаблон, вместо этого вам нужно использовать img
с путем изображения.
<td><img src="{{ each.Image.url }}"> </td>
Это при условии, что у вас правильно настроены статические файлы. О правильной настройке статических файлов см. здесь: https://docs.djangoproject.com/en/4.1/howto/static-files/
Для адресации 3 изображений в строке вам понадобится немного https://docs.djangoproject.com/en/dev/ref/templates/builtins/
<table>
{% for image in images %}
{% if forloop.counter0|divisibleby:"3" %}
<tr>
{% endif %}
<td>{{image}}</td>
{% if forloop.counter|divisibleby:"3" %}
</tr>
{% endif %}
{% if forloop.last and not forloop.counter|divisibleby:"3" %}
</tr>
{% endif %}
{% endfor %}
Используя forloop.counter и forloop.counter0, можно получить счетчик итераций, а передача этого числа в divisibleby позволяет определить, когда начинать и заканчивать новую строку. Последний бит проверяет, нужно ли закрывать тег строки таблицы.