Reputation: 912
I am trying to fix an error AttributeError at /update-qty
which appears which I try to update the quantity related to items in order summary page in my project
I have indicated the line related to the error showing.
Here is the views.py:
class OrderSummaryView(LoginRequiredMixin, View):
def get(self, *args, **kwargs):
try:
order = Order.objects.get(user=self.request.user, ordered=False)
context = {
'object': order
}
return render(self.request, 'order_summary.html', context)
except ObjectDoesNotExist:
messages.warning(self.request, "You do not have an active order")
return redirect("/")
@login_required
def update_qty(request):
if request.method == 'POST':
item_slug = request.POST.get('item_slug', None)
# Check for an order_item
order_item_pk = request.POST.get('order_item', None)
order_item = OrderItem.objects.filter(pk=order_item_pk).first()
if not order_item:
messages.info(request, "Product was not in your cart")
return redirect("product", slug=item_slug)
# Check for an active order
order = Order.objects.filter(user=request.user, ordered=False).first()
if not order:
messages.info(request, "You do not have an active order")
return redirect("product", slug=item_slug)
# Check that order_item is in active order
if not order_item.order == order: <---------------------------------------- Error line
messages.info(request, "Product was not in your cart")
return redirect("product", slug=slug)
# Update quantities
action = request.POST.get('action', None)
if action == "plus":
order_item.quantity += 1
order_item.save()
messages.info(request, "Product quantity was updated.")
elif action == "minus":
order_item.quantity -= 1
if order_item.quantity < 1:
order_item.delete()
messages.info(request, "Product was removed from cart.")
else:
order_item.save()
messages.info(request, "Product quantity was updated.")
return redirect("order-summary")
Here is the template:
<div class="pull-center">
<form method="POST" action="{% url 'core:update-qty' %}">
{% csrf_token %}
<button type="submit" name="action" value="minus" class="btn mr-2"><i class="fa fa-minus"></i></button>
{{ order_item.quantity }}<button type="submit" name="action" value="plus" class="btn ml-2"><i class="fa fa-plus"></i></button>
<input type="hidden" name="item_slug" value="{{ order_item.item.slug }}">
<input type="hidden" name="order_item" value="{{ order_item.pk }}">
</form>
</div> </td>
here is the urls:
path('update-qty', update_qty, name='update-qty'),
Here is the models.py
class Item(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
price = models.FloatField()
slug = models.SlugField(unique=True)
class OrderItem(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
ordered = models.BooleanField(default=False)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
variation = models.ManyToManyField(Variation)
class Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
items = models.ManyToManyField(OrderItem)
ordered = models.BooleanField(default=False)
payment = models.ForeignKey(
'Payment', on_delete=models.SET_NULL, blank=True, null=True)
received = models.BooleanField(default=False)
I have included the models for the items, OrderItem and Order
Upvotes: 0
Views: 1298
Reputation: 682
Your model doesn't have an Order ForeignKey
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE) --> doesn't exist
but can be retrieve thanks to the related_name from the many_to_many (m2m) relation which is by default "classname_set" -> order_set
if not order_item.order_set.filter(pk=order.pk).exists()
Upvotes: 2