通过 ForeignKey 的 Django 用户特定对象
Django User-Specific objects via ForeignKey
我正在尝试实现一个用户特定的购物车,它看起来像:
class Cart (models.Model):
items = []
totalprice = 0
user = models.ForeignKey(User, on_delete=models.CASCADE,
related_name="cart", null=True)
我有一个 HTML 模板,它将显示一个项目并允许当前用户将其添加到他们的购物车:
<ul>
<img src={{ item.pic.url }}>
<li>{{ item.name }}</li>
<li>{{ item.desc }}</li>
<li>${{ item.cost }}</li>
</ul>
<br>
<a href={% url 'gallery:add_to_cart' item.id %}>Add to Cart</a>
add_to_cart函数是:
def add_to_cart (request, id):
if request.user.is_authenticated:
if not request.user.cart.all():
c = Cart()
c.save()
request.user.cart.add(c)
request.user.cart.all()[0].addItem(Item.objects.get(id=id))
return HttpResponseRedirect('/gallery/')
第一个用户一切正常,但是一旦第一个用户注销并且另一个用户登录,他们的购物车似乎交织在一起。 Django 会为第二个用户创建一个 Cart,但是这个 Cart 不会初始化为空;它将与第一个用户的购物车具有相同的内容。
作为第二个用户将任何商品添加到购物车后,该商品将添加到两个购物车,并且它们的内容将相同。
Active "Cart" objects upon adding an Item as the second user
简而言之,我无法在访问购物车时区分各个用户。有什么我可以做的吗?感谢您的任何建议。
谢谢。
您的 Cart
的字段是 python 对象,而不是数据库项目。所以它只是改变了 python 中的对象。你想要:
items = models.ManyToManyField(Item)
totalprice = models.IntegerField()
这意味着 items
和 totalprice
现在与 User
外键一起存储在数据库中。进行此更改后,请确保 makemigrations
和 migrate
您的数据库。
items
是绑定到 Cart
[ 的 可变 对象=30=] class 本身,不 到特定的购物车实例。当您将项目添加到 items
时,只要您的服务器还在处理它,它就会一直保留在那里,或者直到您手动将其删除。
相反,您想要的是 ManyToManyField
引用您的 Item
模型:
class Cart (models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE,
related_name="cart", null=True)
items = models.ManyToManyField('myapp.Item')
现在在您看来,您的查询看起来像这样:
def add_to_cart (request, id):
if request.user.is_authenticated:
cart = Cart.objects.filter(user=request.user)
cart.items.add(id)
...
我正在尝试实现一个用户特定的购物车,它看起来像:
class Cart (models.Model):
items = []
totalprice = 0
user = models.ForeignKey(User, on_delete=models.CASCADE,
related_name="cart", null=True)
我有一个 HTML 模板,它将显示一个项目并允许当前用户将其添加到他们的购物车:
<ul>
<img src={{ item.pic.url }}>
<li>{{ item.name }}</li>
<li>{{ item.desc }}</li>
<li>${{ item.cost }}</li>
</ul>
<br>
<a href={% url 'gallery:add_to_cart' item.id %}>Add to Cart</a>
add_to_cart函数是:
def add_to_cart (request, id):
if request.user.is_authenticated:
if not request.user.cart.all():
c = Cart()
c.save()
request.user.cart.add(c)
request.user.cart.all()[0].addItem(Item.objects.get(id=id))
return HttpResponseRedirect('/gallery/')
第一个用户一切正常,但是一旦第一个用户注销并且另一个用户登录,他们的购物车似乎交织在一起。 Django 会为第二个用户创建一个 Cart,但是这个 Cart 不会初始化为空;它将与第一个用户的购物车具有相同的内容。
作为第二个用户将任何商品添加到购物车后,该商品将添加到两个购物车,并且它们的内容将相同。
Active "Cart" objects upon adding an Item as the second user
简而言之,我无法在访问购物车时区分各个用户。有什么我可以做的吗?感谢您的任何建议。
谢谢。
您的 Cart
的字段是 python 对象,而不是数据库项目。所以它只是改变了 python 中的对象。你想要:
items = models.ManyToManyField(Item)
totalprice = models.IntegerField()
这意味着 items
和 totalprice
现在与 User
外键一起存储在数据库中。进行此更改后,请确保 makemigrations
和 migrate
您的数据库。
items
是绑定到 Cart
[ 的 可变 对象=30=] class 本身,不 到特定的购物车实例。当您将项目添加到 items
时,只要您的服务器还在处理它,它就会一直保留在那里,或者直到您手动将其删除。
相反,您想要的是 ManyToManyField
引用您的 Item
模型:
class Cart (models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE,
related_name="cart", null=True)
items = models.ManyToManyField('myapp.Item')
现在在您看来,您的查询看起来像这样:
def add_to_cart (request, id):
if request.user.is_authenticated:
cart = Cart.objects.filter(user=request.user)
cart.items.add(id)
...