A_K
A_K

Reputation: 912

Django Error: 'OrderItem' object has no attribute 'order'

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

Answers (1)

MSR974
MSR974

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

Related Questions