Удаление всех товаров из корзины после оформления заказа в Django
У меня есть простое приложение электронной коммерции, и я пытаюсь очистить корзину после нажатия кнопки 'Proceed to checkout'. После нажатия кнопки я должен перенаправляться в корзину и не должен видеть ни одного OrderItem в корзине. Также экземпляр базы данных должен быть удален. Как это сделать?
store/models.py
class Item(models.Model):
name = models.CharField(max_length=50)
price = models.FloatField()
def __str__(self):
return self.name
class OrderItem(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField(default=1)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
ordered = models.BooleanField(default=False)
def __str__(self):
return f"{self.quantity} of {self.item.name}"
def get_total_item_price(self):
return self.quantity*self.item.price
def get_final_price(self):
return self.get_total_item_price()
class Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
items = models.ManyToManyField(OrderItem)
start_date = models.DateTimeField(auto_now=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
store/views.py
class HomepageView(generic.ListView):
model = Item
template_name= 'store/index.html'
context_object_name = 'item_list'
class DetailView(generic.DetailView):
model = Item
template_name='store/detail.html'
class CartView(generic.View):
def get(self, *args, **kwargs):
try:
order = Order.objects.get(user=self.request.user, ordered=False)
context = {
'object': order
}
return render(self.request, 'store/cart.html', context)
except ObjectDoesNotExist:
messages.warning(self.request, "You do not have an active order")
return redirect("/")
def checkout(request, user_id):
#code to remove all items from cart
return redirect('store:cart', user_id=user_id)
Надеюсь, вы получаете все в корзину с помощью следующего запроса
order = Order.objects.get(user=self.request.user, ordered=False)
Итак, вы можете удалить корзину, используя тот же запрос с delete()
как показано ниже
Order.objects.get(user=self.request.user, ordered=False).delete()
Если вы просто установите order.ordered = True
в вашей функции checkout
, то запрос корзины не будет действительным, таким образом очистив корзину, и вы сможете сохранить заказ в своих записях. Я не предлагаю полностью удалять объект.
функция checkout() после предложения @DanielOdicho:
def checkout(request, pk):
order = get_object_or_404(Order, pk=pk)
order.ordered = True
order.save()
return redirect('store:cart', user_id=request.user.id)
Это работает!