1

Django に基づいて、自分の Web サイトにショッピング カートを実装しようとしています。

以下は私が使用したモデルです:

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')

シェルにチェックインしましたが、曲をカートに追加しようとすると同じエラーが発生します。カートはNoneTypeオブジェクトであり、属性はありませんsongs

前もって感謝します。

4

2 に答える 2

1

request.userUser現在ログインしているユーザーのオブジェクトのインスタンスです。

Listenerモデルとモデルの間には関係がありませんUser(モデルから継承した場合でも)。そのため、何をしようとしても機能しません。実際、関係があったとしても、オブジェクトの関係を正しく使用していないため、これらのエラーが表示されます。

各ユーザーのショッピング カートを永続的に追跡する場合は、モデルを指すように をモデルに追加する必要がForeignKeyありShoppingCartますUser

セッションのカートを追跡したいだけの場合; そのためにセッションを使用します。

どちらも正しく使用していないため、ドキュメントの関係セクションを確認すると役立つ場合があります。add()

于 2013-05-27T11:07:37.040 に答える