1

我一直在尝试基于 Django 在我的网站上实现购物车。

以下是我使用的模型:

class ShoppingCart(models.Model):
    songs = models.ManyToManyField(Song)
    albums = models.ManyToManyField(Album)

class Listener(User):
    name = models.CharField(max_length=200, blank=True, null=True)
    bio = models.TextField(blank=True, null=True)
    cart = models.ForeignKey(ShoppingCart, blank=True, null=True)

这是views.py我收到错误消息的地方None Type Object has no attribute songs at request.user.listener.cart.songs.add()

def add_to_cart(request):
    if not request.user.is_authenticated() or not request.method == 'POST':
        return HttpResponse(json.dumps({'success':False}), content_type='application/json')
    typeobj = request.POST.get('type', None)
    obj = request.POST.get('id', None)
    if typeobj is None or obj is None:
        return HttpResponse(json.dumps({'success':False}), content_type='application/json')

    if typeobj == 'album':
        try:
            album = Album.objects.get(pk=obj)
        except ObjectDoesNotExist:
            return HttpResponse(json.dumps({'success':False}), content_type='application/json')
        request.user.listener.cart.albums.add(Album.objects.get(pk=obj))
    else:
        try:
            song = Song.objects.get(pk=obj)
        except ObjectDoesNotExist:
            return HttpResponse(json.dumps({'success':False}), content_type='application/json')
        request.user.listener.cart.songs.add(Song.objects.get(pk=obj))
    return HttpResponse(json.dumps({'success':True}), content_type='application/json')

我检查了外壳,当我尝试将歌曲添加到购物车时发生了同样的错误。它说 cart 是一个NoneType对象,没有属性songs

提前致谢。

4

2 回答 2

1
  1. 我认为你应该使用and 之间的OneToOne关系。UserShoppingCart

样品型号:

class Listener(User):
   name = models.CharField(max_length=200, blank=True, null=True)
   bio = models.TextField(blank=True, null=True)
   cart = models.OneToOneField(ShoppingCart, blank=True, null=True)
  1. 在您的视图中为用户创建一个cart如果它不存在

作为

def add_to_cart(request):
    if not request.user.is_authenticated() or not request.method == 'POST':
       return HttpResponse(json.dumps({'success':False}), content_type='application/json')
    typeobj = request.POST.get('type', None)
    obj = request.POST.get('id', None)
    if typeobj is None or obj is None:
        return HttpResponse(json.dumps({'success':False}), content_type='application/json')

    if request.usr.listener.cart == None:
         cart = ShoppingCart()
         cart.save()
         request.usr.listener.cart = cart
         request.usr.listener.save()

    # your code to add items in cart
于 2013-05-27T11:11:41.127 回答
1

request.userUser是当前登录用户的对象的一个​​实例。

Listener您的模型和模型之间没有关系User(即使您从它继承),所以无论您尝试做什么,它都行不通。事实上,即使存在关系,您也会看到这些错误,因为您没有正确使用对象关系。

如果要永久跟踪每个用户的购物车,则需要在模型中添加一个ForeignKeyShoppingCart指向User模型。

如果您只想跟踪购物车的会话;然后使用会话来这样做。

阅读文档的关系部分可能会使您受益,因为您也没有add()正确使用。

于 2013-05-27T11:07:37.040 回答