2017-11-23 5 views
0

私はまだ学生ですので、私は愚かな間違いをしてコードが醜く見える場合、私はまだそれをきれいにする必要があります。私はオンラインWebショップを作らなければならないプロジェクトに忙しかったです。データベースは既に設定されており、メールシステムもありますが、注文データ(ShoppingCartに追加されたアイテム)を実装しようとするたびに、メールにアイテムを指定できません。 ヘッドアップ、私は可能な限り明確なエラーを作るために、以下にたくさんの情報を書きました。Djangoの反復エラー

これは私が得たエラーです:チェックアウト/で

はTypeError/
'た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> 

この210は、電子メールの背後にあるロジックです:

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, '[email protected]', [c]) 
    email.attach_alternative(html_content, "text/html")) 
    email.mixed_subtype = 'related' 

    email.send() 

    clearCart(request) #Clears Shoppingcart 

PS:私は、私はちょうど私がまだに持っていたガイドに従うことをしようとしていた、「オーダー= 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)) 
+1

あなたは{注文%でcreateOrderため%} '何を期待し'行うには?おそらく '{%for%}'タグと '' {%endfor%} 'タグを削除し、' {{order.orderNum}} '、' {{order.productNum}} '、' {{ order.amount}} '。 – Alasdair

+0

私はこのようにすれば、カート内の利用可能なアイテムすべてを繰り返してそのプロパティを与えることになると思ったが、私はそれにショットを与えるだろう –

答えて

2

。 に基づいてorderDetailsEntryであるorderを繰り返すことはできません。

orderDetailsEntryは、クエリーセットではなくDBに挿入したばかりの新しい行であるため、iterableではありません。

多分あなたは次のようなことをしたいですか?

order = OrderDetails.objects.filter(amount=..., orderNum=..., productNum=...)

+0

私は試してみる。それは確かに私が持っていた問題でした。 あなたは私の '' for createOrder forループを取り除くべきだと思いますか、それとも問題ありませんか? –

+0

技術的には、あなたのループをテンプレートで動作させたい場合は、 '{%の順序で%}のcreateOrderを' {'%のorderDetailsの%'}に置き換えるべきです。それ以外に、もしあなたが本当にやりたいことがあれば、私はあなたに話すことができません。 ) –

+0

サーバーを更新して実行した後、私はこのエラーを受け取りました: /checkout/Does notNotExist at Orderと一致するクエリが存在しません。 しかし、私はあなたの最新の変更を実装しようとします。 –