繁体   English   中英

如果用户没有用户名或其他内容,请返回django admin

[英]What to return to django admin if user has not username or something else

总之,我正在做网上商店和django管理员我显示经过身份验证的用户'用户名',但有些用户没有经过身份验证

因此,如果经过身份验证的用户会订购某些东西,那么我可以获得他们的数据。 但是,如果未经身份验证的用户会订购? 什么在django管理员中显示? 如果我将从用户那里仅请求他的名字,那就没有结果。 因为我们知道django需要完全授权

models.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的内置会话框架

从此stackoverflow答案中拉出,您将看到您可以从request对象中收集当前会话密钥。

然后只需更改您的购物车型号:

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"

当然,您需要确保在创建Cart对象将request.session添加到Cart对象中

最后,似乎会话对象有时仍然是空的,所以如果你真的不想在管理员中使用“匿名”行,你应该强制保存它。 这个答案使会话强制保存非常简单:

if not request.session.session_key:
    request.session.save()
session_id = request.session.session_key

在类中编写一个调度方法,以便您可以检查用户是否经过身份验证request.user.is_authenticated将返回用户身份验证的状态。 如果用户未经过身份验证,则根据需要保存用户

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM