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>