无需登录或注册即可添加到购物车 [英] add to cart without login or register
本文介绍了无需登录或注册即可添加到购物车的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
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屋!
查看全文