Django 无类型错误属性

Django 无类型错误属性,django,django-models,django-views,Django,Django Models,Django Views,我一直在尝试在我的网站上实现一个基于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)

我一直在尝试在我的网站上实现一个基于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对象在请求时没有属性songs.user.listener.cart.songs.add()

我签入了shell,当我尝试将歌曲添加到购物车时,也出现了相同的错误。它说cart是一个
NoneType
对象,没有属性
songs


提前感谢。

请求。user
是当前登录用户的
user
对象的实例

您的
侦听器
模型和
用户
模型之间没有关系(即使您继承了它),因此无论您尝试做什么,它都不会起作用。事实上,即使存在关系,您也会看到这些错误,因为您没有正确使用对象关系

如果要永久跟踪每个用户的购物车,则需要将
外键
添加到
购物车
模型中,以指向
用户
模型

如果您只想跟踪一个会话的购物车;然后用它来做

由于您没有正确地使用
add()
,因此阅读文档的最后一部分可能会对您有所帮助

  • 我认为你应该在
    User
    ShoppingCart
    之间使用
    OneToOne
    关系
  • 示例模型:

    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)
    
  • 在您的视图中,如果不存在,则为用户创建一个
    购物车
  • 作为


    我消除了无类型错误。非常感谢。但现在发生的是,每次我尝试向购物车添加歌曲时,都会创建多个购物车。我打开数据库,发现listener表中没有记录购物车id。这意味着侦听器和购物车之间没有关系。此错误是否由.save()的错误实现引起?@karthik,检查更新的代码,创建
    cart
    对象并保存它,然后在
    侦听器中分配并保存。谢谢!为了进一步编辑,request.usr.listener.save()不适用于request.usr.listener.cart.save()会重新创建相同的错误。@karthik,对不起,最后一个应该是
    request.usr.listener.save()
    而不是
    request.usr.listener.cart.save()。试试这个。
    
    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)
    
    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