用户对象没有属性客户

时间:2020-11-04 10:17:36

标签: python django

我正在尝试使用Django创建购物车,但出现此错误。虽然我尝试检查用户是否已通过身份验证,但我使用的是customer = request.user.customer,但它说用户没有属性customer

这是我的views.py

def cart(request):
    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = OrderModel.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()

    else:
        items = []


    context = {}
    return render(request, 'Home/cart.html', context)

这是我的模型。py

class CustomerModel(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, null=True, blank=True, default='')
    customer_name = models.CharField(max_length=1000, null=True)
    customer_phone = models.CharField(max_length=20, null=True)

    def __str__(self):
        return self.customer_name

class OrderModel(models.Model):
    customer = models.ForeignKey(CustomerModel, on_delete=models.SET_NULL, null=True, blank=True)
    order_date = models.DateTimeField(auto_now_add=True)
    complete = models.BooleanField(default=False,null=True,blank=True)
    transaction_id = models.CharField(max_length=1000, null=True)

    def __str__(self):
        return str(self.id)


class OrderItem(models.Model):
    product = models.ForeignKey(ProductModel, on_delete=models.SET_NULL, null=True, blank=True)
    order = models.ForeignKey(OrderModel, on_delete=models.SET_NULL, null=True, blank=True)
    quantity = models.IntegerField(default=0, null=True, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)

   

class Address(models.Model):
    customer = models.ForeignKey(CustomerModel, on_delete=models.SET_NULL, null=True, blank=True)
    order = models.ForeignKey(OrderModel, on_delete=models.SET_NULL, null=True, blank=True)
    address = models.CharField(max_length=10000)
    city = models.CharField(max_length=1000)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.address

我被困在这里,不知道该怎么办。

3 个答案:

答案 0 :(得分:0)

对于CustomerModel的用户字段,必须将“ related_name”和“ related_query_name”设置为“ customer”:

user = models.OneToOneField(User, on_delete = models.CASCADE, null=True, blank=True, default='', related_name='customer', related_query_name='customer')

答案 1 :(得分:0)

我认为将customer = request.user.customer行更改为customer = request.user.customermodel可能会解决您的问题。如果您想使用customer = request.user.customer,请在CustomerModel的字段中添加相关名称:

user = models.OneToOneField(User, on_delete = models.CASCADE, null=True, blank=True, default='', related_name='customer')

注意:确保您的用户对象具有相关的配置文件。 例如,向您的代码中添加一个额外的条件,如下所示:

if hasattr(request.user, 'customer'): # If you have related name otherwise use customermodel
    customer = request.user.customer
else:
    # Return a proper message here

因为如果您的用户对象没有相关的配置文件,则此行代码将引发RelatedObjectDoesNotExist错误类型。

答案 2 :(得分:-1)

您必须在CustomerModel客户字段中设置“ related_name”参数才能进行反向访问

user = models.OneToOneField(User, related_name="user", on_delete = models.CASCADE, null=True, blank=True, default='')

如果您未设置相关名称,django将为访问生成字段名+“ _ set”(在您的示例中为user_set)