在我的django应用程序中,我有一个用户愿望清单功能。我希望匿名用户可以将产品添加到他的愿望清单中。
models.py
class User_Wishlist(models.Model):
created_by = models.ForeignKey(User, default=None, null =True, blank=True)
products = models.ManyToManyField(Products, null=True)
# some Products model
views.py
# to add an item from the user wishlist
def add_userwl(request, id):
products = Products.objects.filter(id__iexact=id)
product = products[0]
if request.user.is_authenticated():
userwlt = get_sl(request, request.user) #gets the auth user wishlist
userwlt.products.add(product)
sl_products = userwlt.products.all()
else:
if "wl_user" in request.session:
wl_user = request.session["wl_user"]
else:
wl_user = User_Wishlist(created_by = request.user) #here lies the problem!
request.session["wl_user"] = wl_user
wl_user.products.add(product)
wl_products = wl_user.products.all()
return render_to_response('getsl.html', {
'wl_products':wl_products
}, context_instance=RequestContext(request))
错误:无法分配“”:“User_Wishlist.created_by”必须是“用户”实例。
因此,它无法为匿名用户创建心愿单。另外,如果我只是执行wl_user = User_Wishlist(),它就无法在不指定用户ID的情况下访问manytomany字段'产品'。
对此的任何帮助都会很棒。谢谢!
p.s:我还希望在anon用户注册后保存此用户心愿单,但那是一个以后的问题
答案 0 :(得分:2)
您对匿名用户的概念似乎有误。如果您希望将数据绑定到某个“用户”,则必须为他们创建“用户”。否则,只要会话过期或“用户”重置其浏览器的缓存,数据就会消失。
现在如何定义“用户”完全取决于您。它可以是“购物车”或“顾客”或其他任何东西。没有理由你不能使用与Django的auth模块提供的抽象不同的抽象。
大多数实现此功能的网站都允许您不那么多的“匿名”会话在某个时刻绑定到可选帐户(这可能是一个oauth或openid解决方案)。
答案 1 :(得分:0)
更简单的解决方案是要求将wishlis绑定到 用户对象或会话对象。因此,允许这些字段为null并实现有利于用户对象的逻辑。