无需登录或注册即可添加到购物车 [英] add to cart without login or register

查看:33
本文介绍了无需登录或注册即可添加到购物车的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

mods.py

class orderbook(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    ordered = models.BooleanField(default=False)
    Book = models.ForeignKey(book, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return f"{self.quantity} of {self.Book.book_nm}"

    def get_total_book_price(self):
        return self.quantity * self.Book.book_price


class Order(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    books = models.ManyToManyField(orderbook)
    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_book in self.books.all():
            total += order_book.get_total_book_price()
        return total

views.py

def add_to_cart(request, slug):
    Book = get_object_or_404(book, slug=slug)
    order_book, created = orderbook.objects.get_or_create(
        Book=Book, user=request.user, ordered=False)
    order_qs = Order.objects.filter(user=request.user, ordered=False)
    if order_qs.exists():
        order = order_qs[0]
        if order.books.filter(Book__slug=Book.slug).exists():
            order_book.quantity += 1
            order_book.save()
            messages.info(
                request, " Cart updated")
        else:
            order.books.add(order_book)
            messages.info(request, "Added to your cart.")
    else:
        ordered_date = timezone.now()
        order = Order.objects.create(
            user=request.user, ordered_date=ordered_date)
        order.books.add(order_book)
        messages.info(request, "Added to your cart.")
    return redirect(request.META['HTTP_REFERER'])

我希望在不登录或注册的情况下使添加到购物车工作,并且每当用户注册或登录项目都会反映在用户的购物车中。它可能正在使用会话或覆盖用户模型。

Html

在基本推荐答案模板的头部,添加脚本以使用该站点为设备设置Cookie。(您完全可以将其更改为仅显示您需要的页面)。此脚本将为每个设备生成唯一ID。

Dennis Ivy制作了一段视频,解释了如何做到这一点:https://youtu.be/-7a8sth8gKo

以下是他的项目的GitHub资源库的链接:https://github.com/divanov11/guest_user_shopping_cart

第一个函数(GetCookie)直接来自Django文档:https://docs.djangoproject.com/en/3.1/ref/csrf/

<script type="text/javascript">

        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = cookies[i].trim();
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }

        function uuidv4() {
          return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
            var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
          });
        }

        let device = getCookie('device')

        if (device == null || device == undefined){
            device = uuidv4()
        }

        document.cookie ='device=' + device + ";domain=;path=/"

    </script>

您可以将设备存储在";客户&的数据库中

# models.py
class Customer(models.Model):
    user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, null=True, blank=True)
    email = models.CharField(max_length=200, null=True, blank=True)
    device = models.CharField(max_length=200, null=True, blank=True)

    def __str__(self):
        if self.name:
            name = self.name
        else:
            name = self.device
        return str(name)
以下是购物车视图的示例: 如果用户(客户)未登录,它将从他们的浏览器中提取Cookie或为他们创建一个Cookie。

# views.py
def cart(request):
    try:
        customer = request.user.customer
    except:
        device = request.COOKIES['device']
        customer, created = Customer.objects.get_or_create(device=device)

    order, created = Order.objects.get_or_create(customer=customer, complete=False)

    context = {'order':order}
    return render(request, 'store/cart.html', context)

这篇关于无需登录或注册即可添加到购物车的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆