hiramatsu0415
@hiramatsu0415

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Django TypeError: '~' object is not iterableエラーについて

Q&A

Closed

前提・実現したいこと

お世話になります。
テンプレートでfor文を使い表示させようとしたところエラーが出てしまいました。
どうぞよろしくお願いいたします。

発生している問題・エラーメッセージ

TypeError: 'BoughtProduct' object is not iterable

該当のソースコード

models.py
class BoughtProduct(models.Model):
  user = models.ForeignKey(Users, on_delete=models.CASCADE)
  product = models.ForeignKey(Product, on_delete=models.CASCADE)
views.py
def bought_products(request,bought_products_id):
  products = Product.objects.get(id=bought_products_id)


  if products.count >= 1:
    bought_products=BoughtProduct()
    bought_products.product = products
    bought_products.user = request.user
    bought_products.save()
    bought_product = bought_products
  else:
    raise ValidationError('エラーが発生しました。事務局までお問い合わせください。')  

  if request.method =="GET":
  #----email-----
    subject = 'TEXMA: 商品が購入されました。'
    message = """商品が購入されました。\n商品名: {}\n発送場所{}""".format(products.product_name,products.place)
    email_from = request.user.email
    email_to = [products.user.email,]
    send_mail(subject, message, email_from, email_to)

  return render(request, 'buy_products.html',context={
    'products':products,

    'bought_product':bought_product
  }) 

buy_product.html
{% extends 'base.html' %}
{% block content %}

<h1>購入商品一覧</h1>
{% for product in bought_product %}
{% if product.user == request.user %}

{{product.product_name}}

{%endif%}
{%endfor%}

{%endblock%}

試したこと

データを挿入してみましたがダメでした。
bought_productはmodelのBoughtProductで、全ての値がForeignKeyです。
ですので、テンプレートに下記のように書いてみたのですが、エラーになってしまいました。

buy_product.html
{% extends 'base.html' %}
{% block content %}

<h1>購入商品一覧</h1>
{% for product in bought_product.product %}
{% if product.user == request.user %}

{{product.product_name}}

{%endif%}
{%endfor%}

{%endblock%}

上記のエラー内容
'Product' object is not iterable

補足情報(FW/ツールのバージョンなど)

Django3, python3.8

0

2Answer

多分理解されているとは思いますが、buy_product.htmlの下記の行でエラーが起きてそうですね

buy_product.html
{% for product in bought_product %}

これは、bought_productには、BoughtProductのリストではなくBoughtProduct自体が入っているからですね。

views.py
  if products.count >= 1:
    # bought_productsには、単一のBoughtProductが入る
    bought_products=BoughtProduct()

もしあるユーザに関する全てのBuyProductを表示したいのなら、最初からユーザで絞ってテンプレートに渡した方がいいです。

views.py
def bought_products(request):
  buy_products = BoughtProduct.obejcts.filter(user=request.user)
buy_product.html
{% extends 'base.html' %}
{% block content %}

<h1>購入商品一覧</h1>
{% for product in bought_product.product %}
{% if product.user == request.user %} # 不要

{{product.product_name}}

{%endif%}
{%endfor%}

{%endblock%}
1Like

Comments

  1. @hiramatsu0415

    Questioner

    とてもご丁寧に説明していただき、誠にありがとうございます。
    とても勉強になりました。

Your answer might help someone💌