python - 如果用户没有用户名或其他内容,返回给 django admin 的内容

标签 python django authentication

简而言之,我正在做在线商店,在 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/

相关文章:

python - 在Python中,如何在不重命名文件的情况下对文件进行原子重写?

Python CFFI 将结构转换为字典

python - 使 matplotlib 绘图窗口弹出为事件窗口

python - 我可以为 Django 中的模型方法创建自定义装饰器吗?

python - 使用 Python 在 SSL 站点上登录、导航和提取文本?

node.js - PEM 例程 :PEM_read_bio:no start line - Unable to decode JWT token

python - 在Python中绘制格子树

django - 使用 ElastiCache Redis 配置 django-redis 时出现问题(已启用集群模式)

Django:获取有序查询集的值

javascript - JS 混合应用程序 - 在 localStorage 中存储 token