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 对象

TypeError:无法在 Django 视图函数中解压不可迭代的 int 对象

模型 Django 不可迭代

Java中的Pig UDF:错误---错误1066:无法打开别名的迭代器