简而言之,我正在做在线商店,在 django 管理中我显示经过身份验证的用户“用户名”,但有些用户没有经过身份验证
因此,如果经过身份验证的用户会订购东西,那没关系,我有他们的数据。 但是,如果未经身份验证的用户会订购吗?在 django 管理中显示什么? 如果我只从用户那里请求他的名字,那么没有结果。因为我们知道django需要完全授权
模型.py
class Cart(models.Model):
user = models.ForeignKey(User, null=True, blank=True)
products = models.ManyToManyField(Product, through=CartProduct)
class Meta:
verbose_name = 'Cart'
verbose_name_plural = 'Cart'
def __str__(self):
return self.user.username # That for authenticated users
views.py
class CartView(View):
def get(self,request,*args,**kwargs):
cart_id = request.session.get('cart_id')
if cart_id == None:
cart = Cart()
cart.save()
request.session['cart_id'] = cart_id
cart = Cart.objects.get(id=cart_id)
product_id = request.GET.get('product')
delete_product = request.GET.get('delete')
if product_id:
product_instance = get_object_or_404(Product, id=product_id)
amount = request.GET.get('amount')
cart_product = CartProduct.objects.get_or_create(cart=cart, product=product_instance)[0]
if delete_product:
cart_product.delete()
else:
cart_product.amount = amount
cart_product.save()
return HttpResponseRedirect('/')
最佳答案
您可以使用 IP 地址,但这可能会造成混淆/多人可以共享一个。
所以我的建议是使用 Django 的内置 session framework .
从 this stackoverflow answer 中提取,您会看到您可以从 request
对象收集当前 session key 。
那么只需更改您的购物车模型即可:
from django.contrib.sessions.models import Session
class Cart(models.Model):
user = models.ForeignKey(User, null=True, blank=True)
session = models.ForeignKey(Session, null=True, blank=True)
products = models.ManyToManyField(Product, through=CartProduct)
class Meta:
verbose_name = 'Cart'
verbose_name_plural = 'Cart'
def __str__(self):
if self.user :
return self.user.username # For for authenticated users
else if self.session :
return self.session.session_key
else :
return "Anonymous"
当然,您需要确保在创建购物车对象时将 request.session 添加到您的购物车对象。
最后,似乎 session 对象有时仍然是空的,所以如果您真的不想在您的管理中出现“匿名”行,您应该考虑强制保存它。 This answer使强制保存 session 变得非常简单:
if not request.session.session_key:
request.session.save()
session_id = request.session.session_key
关于python - 如果用户没有用户名或其他内容,返回给 django admin 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47219973/