Django中的迭代错误
Posted
技术标签:
【中文标题】Django中的迭代错误【英文标题】:Iteration error in Django 【发布时间】:2017-11-23 16:36:27 【问题描述】:我还是个学生,如果我犯了愚蠢的错误并且代码看起来很丑陋,我很抱歉,我仍然需要清理它。我正忙于一个项目,我们必须建立一个在线网上商店。数据库已经设置好,电子邮件系统也是如此,但是每当我尝试实现订购的数据(添加到您的 ShoppingCart 的项目)时,我都无法在电子邮件中指定项目。 提醒,我在下面写了很多信息,以使错误尽可能清晰。
这是我得到的错误:
/checkout/处的类型错误 “OrderDetails”对象不可迭代 模板渲染出错
16 % for createOrder in order %
这是电子邮件 html:
<!--This order email-->
% load custom_tags %
% load shoppingcart_tags %
% block extrastyle %
<style type="text/css">
body.login background-color: palegreen;
</style>
% endblock %
% autoescape off %
<p>Beste klant,</p>
<p></p>
<p>U heeft zojuist een bestelling geplaatst op onze website voor de volgende producten:</p>
% block purchases %
% for createOrder in order %
<h1> orderDetails.orderNum </h1>
<h1> orderDetails.productNum </h1>
<h1> orderDetails.amount </h1>
% endfor %
% endblock %
<p>Wij streven ernaar uw bestelling binnen 2 dagen tijd bij u te leveren.</p>
<p>Als u nog enige vragen heeft, wees dan niet bang ons te contacteren via onze online contact forum</p>
<p>http://HiddenName.com/contact/</p>
<p></p>
<p>Wij hopen u hierbij genoeg van dienst geweest te zijn.</p>
<p></p>
<p>Met vriendelijke groeten,</p>
<p></p>
<p><strong>HiddenName</strong></p>
% endautoescape %
</body>
</html>
这是电子邮件背后的逻辑:
from django.db.models import Max
from ..models import Orders, OrderDetails, ShoppingCart, Customers, Address
from django.utils import timezone
from .CartOps import clearCart
from django.template.loader import render_to_string
from django.core.mail import send_mail, EmailMultiAlternatives
from ..models import OrderDetails
def createOrder(request):
date = timezone.now().date()
status = "Processed"
if not request.user.is_authenticated:
custID = createCustomer(request)
else:
custID = request.user.id
orderEntry = Orders(orderNum=getNewOrderNum(), orderDate=date, orderStatus=status, customerID=Customers(customerID=custID))
orderEntry.save()
for e in ShoppingCart.objects.all().filter(session_key=request.session.session_key):
orderDetailsEntry = OrderDetails(amount=e.amount, orderNum=Orders(orderNum=orderEntry.orderNum), productNum=e.prodNum)
orderDetailsEntry.save()
createAddress(request, custID) #Sla het adres op, of update deze indien nodig
c = request.session['customer_email']
order = orderDetailsEntry
html_content = render_to_string('mail/order_complete_email.html', "order" : order )
text_content = render_to_string('mail/order_complete_email.txt')
email = EmailMultiAlternatives("Your order details", text_content, 'noreply@HiddenName.com', [c])
email.attach_alternative(html_content, "text/html"))
email.mixed_subtype = 'related'
email.send()
clearCart(request) #Clears Shoppingcart
PS:我知道“order = orderDetailsEntry”不是必需的,我只是想遵循一个我仍然需要更改的指南。
如果需要,模型如下所示:
class OrderDetails(models.Model):
class Meta:
unique_together = ('orderNum', 'productNum')
verbose_name_plural = "Order details"
orderNum = models.ForeignKey(Orders, db_column='orderNum')
productNum = models.ForeignKey(Products, db_column='productNum')
amount = models.IntegerField()
def __str__(self):
return (str(self.orderNum))
【问题讨论】:
您希望% for createOrder in order %
做什么?也许你应该删除% for %
标签和``% endfor %` 标签,然后简单地做 order.orderNum
, order.productNum
, order.amount
。
我想如果我这样做,它会遍历购物车中的所有可用物品并给出它们的属性,但我会试一试
【参考方案1】:
我认为存在混淆。根据您的views.py
,您不能迭代order
,这是一个orderDetailsEntry
。
orderDetailsEntry
不可迭代,因为这是您刚刚插入数据库的新行,而不是查询集。
也许您想执行以下操作?
order = OrderDetails.objects.filter(amount=..., orderNum=..., productNum=...)
【讨论】:
我试试,一秒钟。这确实是我遇到的问题,虽然是的。你认为我应该摆脱我的''for createOrder in order''循环还是这样好吗? 从技术上讲,如果您希望循环在模板中工作,您确实应该将% for createOrder in order %
替换为 % for orderDetails in order %
。除此之外,我不能告诉你这是否是你真正想做的。我们应该更多地谈论你的项目的逻辑;)
更新服务器并运行后,出现此错误:DoesNotExist at /checkout/ OrderDetails 匹配查询不存在。但我会尝试实施您的最新更改。
奇怪的是你得到了一个DoesNotExist
异常,因为它只发生在get()
,而不是filter()
。如果您实际上使用了get()
而不是filter()
,那么DoesNotExist
仅表示对DB 的查询没有返回任何结果(您要查找的行在DB 中不存在)。
我在问我现在正在工作的人数据库的数据是否被正确注入,因为这确实很奇怪以上是关于Django中的迭代错误的主要内容,如果未能解决你的问题,请参考以下文章
空视图上的Django rest框架错误:必须先呈现响应内容,然后才能对其进行迭代
Django TypeError:“PosixPath”类型的参数不可迭代
无法在 django 中解压不可迭代的 ModelBase 对象