Мои пункты заказа и заказ сохраняются в админке django, но не отображаются в шаблоне корзины, и количество не обновляется до 3nos
Здесь я пытаюсь добавить товар в корзину. Но я столкнулся с некоторыми проблемами. Во-первых, в шаблоне корзины не отображаются объекты, которые я хочу добавить в корзину, но в админке django товары видны. Однако количество товара не увеличивается само по себе. Два одинаковых продукта добавляются с номерами 1, 2. Однако, когда я пытаюсь добавить один и тот же продукт трижды, то происходит дублирование второго добавленного продукта .Вы можете видеть скриншот ниже :
views.py:
@login_required
def add_to_cart(request, uid):
item = AffProduct.objects.get(uid=uid)
try:
order_item = OrderItem.objects.create(
item=item,
user=request.user,
ordered=False
)
except:
order_item = None
order_qs = Order.objects.filter(user=request.user, ordered=False)
if order_qs.exists():
order = order_qs[0]
# check if the order item is in the order
if order.items.filter(item__uid=item.uid).exists():
order_item.quantity = order_item.quantity + 1
order_item.save()
print(order_item)
messages.info(request, "This item quantity was updated.")
return redirect("cart")
else:
order.items.add(order_item)
print(order_item)
messages.info(request, "This item was added to your cart.")
return redirect("cart")
else:
ordered_date = timezone.now()
order = Order.objects.create(
user=request.user, ordered_date=ordered_date)
order.items.create(order_item)
print(order_item)
messages.info(request, "This item was added to your cart.")
return redirect("cart")
models.py
class OrderItem(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
ordered = models.BooleanField(default=False)
item = models.ForeignKey(AffProduct, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
def __str__(self):
return f"{self.quantity} of {self.item.product_title}"
def get_total_item_price(self):
return self.quantity * self.item.sale_price
def get_total_discount_item_price(self):
return self.quantity * (self.item.discount/Decimal('100'))
def get_amount_saved(self):
return self.get_total_item_price() - self.get_total_discount_item_price()
def get_final_price(self):
if self.item.discount_price:
return self.get_total_discount_item_price()
return self.get_total_item_price()
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
items = models.ManyToManyField(OrderItem)
start_date = models.DateTimeField(auto_now_add=True)
ordered_date = models.DateTimeField()
ordered = models.BooleanField(default=False)
def __str__(self):
return self.user.username
def get_total(self):
total = 0
for order_item in self.items.all():
total += order_item.get_final_price()
return total
Также есть еще одна модель в другом приложении внутри того же проекта, откуда я получаю все продукты в этом приложении. Продукты хранятся здесь. Имя этой модели "AffProduct". cart.html
<main>
<div class="container">
<div class="table-responsive text-nowrap">
<h2>Order Summary</h2>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Item title</th>
<th scope="col">Price</th>
<th scope="col">Quantity</th>
<th scope="col">Total Item Price</th>
</tr>
</thead>
<tbody>
{% for item in order %}
<tr>
<th scope="row">{{ forloop.counter }}</th>
<td>{{ item.product_title }}</td>
<td>{{ item.item.sale_price }}</td>
<td>
<a href=""><i class="fas fa-minus mr-2"></i></a>
{{ item.quantity }}
<a href="{% url 'add-to-cart' order_item.item.uid %}"><i class="fas fa-plus ml-2"></i></a>
</td>
<td>
{% if item.discount %}
${{ item.get_total_discount_item_price }}
<span class="badge badge-primary">Saving ${{ item.get_amount_saved }}</span>
{% else %}
${{ item.get_total_item_price }}
{% endif %}
<a style='color: red;' href="{% url 'remove-from-cart' %}">
<i class="fas fa-trash float-right"></i>
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan='5'>Your cart is empty</td>
</tr>
<tr>
<td colspan="5">
<a class='btn btn-primary float-right' href='/'>Continue shopping</a>
</td>
</tr>
{% endfor %}
<!--{% if object.coupon %}
<tr>
<td colspan="4"><b>Coupon</b></td>
<td><b>-${{ object.coupon.amount }}</b></td>
</tr>
{% endif %}-->
{% if object.get_total %}
<tr>
<td colspan="4"><b>Order Total</b></td>
<td><b>${{ object.get_total }}</b></td>
</tr>
<tr>
<td colspan="5">
<a class='btn btn-warning float-right ml-2' href=''>Proceed to checkout</a>
<a class='btn btn-primary float-right' href='/'>Continue shopping</a>
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
</main>