0
class Product(models.Model):
    title           = models.CharField(max_length=120)
    slug            = models.SlugField(blank=True)
    description     = models.TextField()
    price           = models.DecimalField(decimal_places=2, max_digits=20, default=39.99)
    image           = models.ImageField(upload_to=upload_image_path,null=True, blank=True)
    featured        = models.BooleanField(default=False)
    # quantity        = models.IntegerField(default=1, null=True, blank=True)
    active          = models.BooleanField(default=True)
    timestamp       = models.DateTimeField(auto_now_add=True)

class OrderItem(models.Model):
    user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
    ordered = models.BooleanField(default=False)
    item = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)


class Cart(models.Model):
    user        = models.ForeignKey(User,null=True, blank=True,on_delete=models.CASCADE)
    products    = models.ManyToManyField(OrderItem, blank=True)
    subtotal    = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    total       = models.DecimalField(default=0.00,max_digits=100,decimal_places=2)
    updated     = models.DateTimeField(auto_now=True)
    timestamp   = models.DateTimeField(auto_now_add=True)

"""i am trying to create a ecom website and trying to add products in cart without login 
   the below code works with login user as request.user how to change it with guest user 
"""

def add_cart(request, slug):
    item = get_object_or_404(Product,slug=slug)
    order_item ,created = OrderItem.objects.get_or_create(
        user=request.user,
        item =item,
    )
    print(order_item)

    order_qs = Cart.objects.filter(user=request.user)
    if order_qs.exists():
        order= order_qs[0]
        # check if the order item is in the order
        if order.products.filter(item__slug=item.slug).exists():
            order_item.quantity+= 1
            order_item.save()
            print("1")
        else:
            order.products.add(order_item)
    else:
        order = Cart.objects.create(
            user=request.user
        )
        order.products.add(order_item)
        print("done")
    return redirect("cart:home")

I am trying to create a ecom website and trying to add products in cart without the below code works with login user with request.user how to change it with guest user and perform add cart and and quandity to products as guest user

2 Answers2

1

You need to use Django Sessions Framework to achieve this. Django Sessions Framework

I am not sure that this is the best solution but the below code worked for me like a charm. And use this method if do not want to use JavaScript and only want to stick to the Django Sessions Framework.

In your Cart model:

class Cart(models.Model):
  user        = models.ForeignKey(User,null=True, blank=True,on_delete=models.CASCADE)
  products    = models.ManyToManyField(OrderItem, blank=True)
  subtotal    = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
  total       = models.DecimalField(default=0.00,max_digits=100,decimal_places=2)
  updated     = models.DateTimeField(auto_now=True)
  timestamp   = models.DateTimeField(auto_now_add=True)
  ordered     = models.BooleanField(default=False)
  session_key = models.CharField(max_length=40, null=True)

In your view.py

def add_cart(request, slug):
if request.user.is_authenticated:
    item = get_object_or_404(Product,slug=slug)
    order_item ,created = OrderItem.objects.get_or_create(
        user=request.user,
        item =item,
    )
    print(order_item)

    order_qs = Cart.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.products.filter(item__slug=item.slug).exists():
            order_item.quantity+= 1
            order_item.save()
            print("1")
        else:
            order.products.add(order_item)
    else:
        order = Cart.objects.create(
            user=request.user
        )
        order.products.add(order_item)
        print("done")
    return redirect("cart:home")
else:
    item = get_object_or_404(Product,slug=slug)
    order_item ,created = OrderItem.objects.get_or_create(
        user=None,
        item =item,
    )
    print(order_item)

    order_qs = Cart.objects.filter(user=None, ordered=False, session_key=request.session.session_key)
    if order_qs.exists():
        order= order_qs[0]
        # check if the order item is in the order
        if order.products.filter(item__slug=item.slug).exists():
            order_item.quantity+= 1
            order_item.save()
            print("1")
        else:
            order.products.add(order_item)
    else:
        order = Cart.objects.create(
            user=None, session_key=request.session.session_key
        )
        order.products.add(order_item)
        print("done")
    return redirect("cart:home")

Furter Reference: Thanks to Todor Django: Anonymous session & "temporary" one-to-one related model?

Devendra
  • 73
  • 7
0

You could create a specific user in your database that represents a guest user and assign the cart to that user. However, I do not recommend this.

I assume you want a visitor to be able to save their shopping cart. You can also achieve this by setting a cookie containing the cart data. You'll not need any backend for this as this can be build with javascript.

Vincent
  • 1,494
  • 12
  • 26