我正在尝试使用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
我被困在这里,不知道该怎么办。
答案 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)