Как вывести значения модели, объединенной через внешний ключ в django?
У меня есть одна модель, названная как элемент следующим образом:
class Item(models.Model):
title = models.CharField(max_length=100)
price = models.FloatField()
bargainprice = models.FloatField(default=0)
discount_price = models.FloatField(blank=True, null=True)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=2)
label = models.CharField(choices=LABEL_CHOICES, max_length=1)
slug = models.SlugField()
description = models.TextField()
image = models.ImageField()
и есть страница продукта под названием "product.html", которая показывает текущую информацию о продукте, как показано на изображении : изображение страницы продукта
и я получаю все эти данные в product.html с помощью представления следующим образом :
class ItemDetailView(DetailView):
model = Item
template_name = "product.html"
и в product.html я получаю данные с помощью синтаксиса :
<span class="mr-1">
<del>₹ {{ object.price }}</del>
</span>
<span>₹ {{ object.discount_price }}</span>
Это одна история, которая работает нормально без проблем, пока не **проблема начинается, когда я создаю эту модель Bargain ниже **
class Bargain(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
item = models.ForeignKey(
Item,
on_delete=models.CASCADE
)
bprice = models.FloatField()
class Meta:
constraints = [
models.UniqueConstraint(
fields=['item', 'user'], name='unique_user_item')
]
* позвольте мне объяснить цель этой модели сделки. фактически эта модель используется для того, чтобы торговаться о цене продукта, она принимает входную цену от пользователя и обновляет модель сделки со следующими значениями User, Item и "bprice", которая является новой ценой продукта после торгов *
и я успешно создал объект "Bargain object (3)" в модале со значениями, показанными на изображении: изображение значений модала
**so what i need - if user have bargained the price product.html show the bargain price which is "bprice" in the Bargain modal instead of product price in Item modal** of the respective user**
для достижения этого я изменил свой itemView следующим образом :
class ItemDetailView(DetailView):
model = Item
template_name = "product.html"
def get_bargain(self, request):
if request.user.is_authenticated():
return Bargain.objects.filter(item=self.object, user=request.user).first()
и в product.html я делаю следующее :<h1>This is the {{ view.get_bargain.bprice }}</h1>
*но это ничего не дает. больше информации - вошедший пользователь admin
Может ли кто-нибудь подсказать мне, что я делаю неправильно или какой-нибудь другой способ сделать это? Заранее спасибо.
здесь вы можете расширить ваше представление с LoginRequiredMixin
если ваше представление ограничено для вошедших в систему пользователей. Тогда вы можете указать имя контекстного объекта "item", как показано ниже.
class ItemDetailView(LoginRequiredMixin, DetailView):
model = Item
template_name = "product.html"
context_object_name = "item"
def get_object(self, queryset=None):
return get_object_or_404(self.model, pk=self.kwargs['pk'])
и в вашем шаблоне вы можете получить все выгодные предложения, связанные с этим товаром. Подобно.
{% if item.bargain %}
<h1>This is the {{ item.bargain.first.bprice }}</h1>
{% else %}
<h1> no bargain against this item </h1>
{% endif %}
Подробности:
item
- это элемент контекста. и item.bargain.first
дает вам доступ к первому элементу сделки.