Итерация над объектом модели в шаблоне не дает результатов - Django
Это моя модель:
pass
class Listing(models.Model):
title = models.CharField(max_length=200)
description = models.CharField(max_length=500)
url = models.URLField()
live = models.BooleanField(default=True)
author = models.ForeignKey('User', on_delete=models.CASCADE, name='author')
category = models.ForeignKey('Category', on_delete=models.CASCADE, name='category', default="")
def __str__(self):
return f'{self.id}: {self.title}'
class Bid(models.Model):
price = models.DecimalField(decimal_places=2, max_digits=10)
bid_count = models.IntegerField()
highest_bidder = models.ForeignKey('User', on_delete=models.PROTECT, name="highest_bidder", default=None, blank=True, null=True)
listing = models.ForeignKey('Listing', on_delete=models.CASCADE, name='listing', default="")
def __str__(self):
return f'{self.listing.title} ({self.price})'
class Category(models.Model):
title = models.CharField(max_length=200)
def __str__(self):
return self.title
class Watchlist(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE, name='user')
item = models.ManyToManyField('Listing', blank=True, null=True)
def __str__(self):
return f"{self.user}'s Watchlist"
Вот мое мнение:
currentUser = request.user
watchlist = Watchlist.objects.filter(user=request.user).values()
bids = Bid.objects.all()
return render(request, 'auctions/userWatchlist.html', {
'currentUser': currentUser,
'watchlist': watchlist,
'bids': bids
})
Я также пробовал не передавать .values() и использовать .all в шаблоне вместо этого. Вот шаблон:
{% block body %}
<h2>Watchlist</h2>
<div class="container">
<div class="row">
{% for listing in watchlist %}
<div>{{ listing }}</div>
<div class="col">
<div class="card" style="width: 18rem;">
<img src="{{ listing.item.url }}" class="card-img-top" alt="{{ listing.item.title }}">
<div class="card-body">
<h5 class="card-title">{{ listing.item.title }}</h5>
<p class="card-text">{{ listing.item.description }}</p>
{% for bid in bids.all %}
{% if bid.listing == listing.item %}
<p class="card-text">Bid price: {{ bid.price }}</p>
{% endif %}
{% endfor %}
<a href="{% url 'item_details' listing.id %}" class="btn btn-primary">Item Details</a>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}
При том, как все сейчас устроено выше, вот что возвращается на страницу:
Вы можете видеть, где я проверяю результаты цикла for, чтобы увидеть, что хранится в листинге, чтобы попытаться понять, почему listing.item.url не заполняется. Из этого результата видно, что это происходит потому, что в листинге нет элемента. Если это поможет, вот как я создаю элементы списка наблюдения:
item = Listing.objects.get(pk=item_id)
bid = Bid.objects.get(listing=item)
form = NewBidForm()
onWatchlist = None
if Watchlist.objects.filter(user=request.user, item=item_id).exists():
Watchlist.objects.filter(user=request.user, item=item_id).delete()
onWatchlist = False
else:
watchlist, _ = Watchlist.objects.get_or_create(user=request.user)
watchlist.item.add(item)
onWatchlist = True
return render(request, 'auctions/itemDetails.html', {
'item': item,
'bid': bid,
'form': form,
'onWatchlist': onWatchlist
})
Я не понимаю, почему я не могу получить доступ к полю элемента (связанному с правильными полями листинга) в объекте Watchlist. Связано ли это с тем, что это отображение "многие ко многим"?
Я хотел бы иметь возможность заполнить пустую карточку изображениями и информацией о товарах, которые находятся на странице списка просмотра.
Если вам нужна еще какая-то помощь, пожалуйста, дайте мне знать(:
)