Использование регулярного выражения для имени поля в Django
У меня есть модель в Django, которая имеет поля photo_1
, photo_2
, photo_3
и многие другие поля, которые не содержат строку "фото" в своих именах. Кроме того, поля фото могут быть пустыми, поэтому я могу найти несколько строк с пустыми полями фото. Есть ли способ для html шаблона пройтись по полям с именем "^photo_[0-9]*$" и выбрать только те, которые не пустые?
Вот что я имею в виду:
# views.py file
def listing(request, listing_id):
listing = get_object_or_404(Listing, pk=listing_id)
context = {
'listing': listing
}
return render(request,"listings/listing.html", context)
# listsing.html file
<div class="col-md-2">
<a href="{{listing.photo_n.url}}" data-lightbox="home-images">
<img src="{{listing.photo_n.url}}" alt="" class="img-fluid">
</a>
</div>
Я хотел бы пройтись по "listing" QuerySet, ища поля с именем "^photo_[0-9]*$" и, если значение для этого поля не пусто, передать ему ref="{{}}" и src="{{}}". tks
Обычно не хорошей идеей является создание модели с большим количеством photo_i
полей: это означает, что база данных должна хранить большое количество полей, где, скорее всего, большинство из них пустые, но, кроме того, это усложняет запрос (например, поиск Listing
объекта, который содержит определенную фотографию, приведет к длинному запросу) и, кроме того, вероятно, в конечном итоге вам понадобится Listing
с дополнительной фотографией.
Чтобы реализовать что-то, где Listing
может иметь произвольное количество фотографий, создается дополнительная модель, которая имеет поле photo
и связана с объектом Listing
через ForeingKey
.
Таким образом, модель выглядит следующим образом:
class Listing(models.Model):
# no photo_i items
# …
pass
class ListingPhoto(models.Model):
listing = models.ForeignKey(
Listing,
on_delete=models.CASCADE,
related_name='photos'
)
photo = models.ImageField()
тогда вы можете визуализировать фотографии с помощью:
<div class="col-md-2">
{% for photo in listing.photos.all %}
<a href="{{ photo.photo.url }}" data-lightbox="home-images">
<img src="{{ photo.photo.url }}" alt="" class="img-fluid">
</a>
</div>