我想创建一个与用户ID绑定的购物车应用。主要是因为如果用户注销,购物车中的物品将不会被删除。
这是我的第一个Django项目,所以我不能100%地确定这是否是一个好主意,因为我正在跟踪所有有关购物车使用过程的教程,因此如果有人可以给我一些反馈,那就太好了。
这是我的模型。py:
from django.db import models
from django.conf import settings
from menulistapp.models import menulist
User = settings.AUTH_USER_MODEL
class CartManager(models.Manager):
def new_or_get(self, request):
try:
cart_obj = Cart.objects.get(id=request.user.id)
new_obj = False
except Cart.DoesNotExist:
new_obj = True
cart_obj = Cart.objects.create(user=request.user)
cart_obj.id = request.user.id
return cart_obj
class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ManyToManyField(menulist, blank=True)
total = models.DecimalField(default=0.0, max_digits=10, decimal_places=1)
updated = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = CartManager()
def __str__(self):
return str(self.id)
这是我的观点:
def cart_home(request):
template = "cartapp/home.html"
cart_id = request.user.id
cart_obj = Cart.objects.new_or_get(request)
context = {
"x": request.user,
}
return render(request, template, context)
答案 0 :(得分:1)
除了自定义管理器之外,我认为您对Model
的实现看起来还不错。 Django Manager已经建立了get_or_create方法,与您的方法类似。您可以像这样使用它:
cart, created = Cart.objects.get_or_create(user=request.user)
,您应该这样更新视图:
from django.contrib.auth.decorators import login_required
@login_required
def cart_home(request):
template = "cartapp/home.html"
cart_obj, created = Cart.objects.get_or_create(user=request.user)
context = {
"cart": cart_obj, # you don't need to pass request.user because its already available in template via {{ user }}
}
return render(request, template, context)
答案 1 :(得分:1)
是的,您应该将购物车对象与用户绑定,因为:
这些是将购物车对象与用户绑定的一些基本原因。为了支持访客用户/匿名用户,您也可以将购物车与会话绑定。