I have a model in Django that has the fields photo_1
, photo_2
, photo_3
and many other fields that does not contains the “photo” string on their names. Also, the photo fields can be blank, so I can find some rows with empty photo fields. For the html template, is there a way to go through the fields named “^photo_[0-9]*$” and selecting only those that are not empty ?
Here is what I mean:
# 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>
I would like to go through the “listing” QuerySet, searching for the fields named “^photo_[0-9]*$” and, if the the value for that field is not empty, pass it to ref=”{{}}” and src=”{{}}” tks
Advertisement
Answer
Usually it is not a good idea to create a model with a lot of photo_i
fields: it means that the database needs to store a lot of fields where it is likely that most of them are empty, but furthermore it makes querying harder (for example finding a Listing
object that contains a certain photo will result in a longe query) and furthermore likely eventually you will need a Listing
with an extra photo.
In order to implement something where a Listing
can have an arbitrary amount of photo’s, one makes an extra model that has a photo
field, and links to a Listing
object through a ForeingKey
.
This thus means that the model looks like:
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()
then you can render the photos with:
<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>