【发布时间】:2021-05-08 04:16:36
【问题描述】:
您好,我正在建立一个具有购物车和结帐功能的网上商店。现在我正在尝试将产品及其数量添加到电子邮件表单中,显然我想将其发送到电子邮件中,但我不知道如何获取 item.name 或 item.quantity 而不会出现如图所示的错误下面。
我有以下型号:
class Customer(models.Model):
user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
name = models.CharField(max_length=200, null=True)
email = models.CharField(max_length=200)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=200, null=True)
price = models.FloatField()
digital = models.BooleanField(default=False, null=True, blank=False) # Nicht nötig
image = models.ImageField(null=True, blank=True)
def __str__(self):
return self.name
@property
def imageURL(self):
try:
url = self.image.url
except:
url = ''
return url
class Order(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
date_ordered = models.DateTimeField(auto_now_add=True)
complete = models.BooleanField(default=False, null=True, blank=False)
transaction_id = models.CharField(max_length=200, null=True)
def __str__(self):
return str(self.id)
@property
def get_cart_total(self):
orderitems = self.orderitem_set.all()
total = sum([item.get_total for item in orderitems])
return total
@property
def get_cart_items(self):
orderitems = self.orderitem_set.all()
total = sum([item.quantity for item in orderitems])
return total
class OrderItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
quantity = models.IntegerField(default=0, null=True, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
@property
def get_total(self):
total = self.product.price * self.quantity
return total
所以我试图从查询集中获取产品名称和数量。但我收到标题中描述的错误
AttributeError: 'QuerySet' 对象没有属性 'product'。
我正在尝试将客户选择的产品名称和数量附加到消息变量中,该变量将通过 sendmail() 发送到电子邮件。
这是我的看法:
@login_required(login_url='login')
def checkout(request):
if request.method == "POST":
message_name = request.POST['message-name']
message_email = request.POST['message-email']
message = request.POST['message']
message_to_send = str(message)
# send an email
send_mail(
'message from ' + message_name, # subject
message_to_send, # message
message_email, # from email
['jeampo@outlook.de'], # To Email
)
if request.user.is_authenticated:
customer = request.user.customer
order, created = Order.objects.get_or_create(customer=customer, complete=False)
items = order.orderitem_set.all()
cartItems = order.get_cart_items
print(items.product.name)
print(items.quantity)
context = {'items': items, 'order': order, 'cartItems': cartItems}
return render(request, 'store/checkout.html', context)
感谢您的帮助。
【问题讨论】:
-
在我看来,您正在获取所有项目,然后尝试获取产品的单一名称,您将不得不遍历所有项目。使用
for item in items然后你可以调用item.product.name -
@Shyrtle 谢谢,我试试我可以在views.py文件中写for循环对吗?
-
是的,就在视图中。仔细检查它是否有效,我可以更详细地回答我的答案。
-
@Shyrtle 谢谢它的工作,但现在我必须将它保存在变量或字典或其他东西中,以便我可以通过电子邮件发送消息和项目。知道我该怎么做吗?
-
您可以在 django 模板中执行 for 循环。
{% for item in items %}
标签: python django django-models django-views model