質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3692閲覧

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

Mitsu_

総合スコア10

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/27 23:51

編集2021/05/28 00:00

前提・実現したいこと

お世話になります。
テンプレートで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) print(bought_product) return render(request, 'buy_products.html',context={ 'products':products, 'bought_product':bought_product })

template(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です。
ですので、テンプレートに下記のように書いてみたのですが、エラーになってしまいました。

{% 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

BoughtProduct object (7) Internal Server Error: /SellText/bought_products/9/ packages/django/template/defaulttags.py", line 167, in render values = list(values) TypeError: 'Product' object is not iterable

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

Django3, python3.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/05/27 23:55

views.pyファイル内にて、render関数を呼ぶ前にprint(bought_product)していただき、データ内容を確認させていただくことは可能でしょうか?????‍♂️
Mitsu_

2021/05/28 00:03

コメント誠にありがとうございます。 print(bought_product)をアップいたしました。 print(bought_product)の場所があっているか確認していただきたいです????‍♂️ BoughtProduct object (7) values = list(values) 多分なのですが、この二つのうちどれかが、printで表示されたものかと思います どうぞよろしくお願いいたいします。
退会済みユーザー

退会済みユーザー

2021/05/28 00:09

うーん、思っていた感じの出力が出ていませんね。 >BoughtProduct object (7) values = list(values) こちらはエラーに関するprintだと思っております。 print(bought_product)の後にexit()して表示される値をいただけますか?度々すみません。????‍♂️
Mitsu_

2021/05/28 00:13

とんでもございません。 SystemExit: None となりました。 よろしくお願いいたします
退会済みユーザー

退会済みユーザー

2021/05/28 00:21

うーん。。 print('hoge') print(bought_product) exit() と記載すると、どのような値がターミナルに返ってきますでしょうか?(少なからず、hogeは返ってくるはずです。)
quickquip

2021/05/28 00:26

{% for product in bought_product.product %} の意図はなんでしょう? (のちのち?)複数商品を繰り返し表示させたいと思っていて、その途中のコードだと思えばいいですか?
Mitsu_

2021/05/28 00:29

exit()を入れると、何も表示されませんでした。 print('hoge')、print(bought_product)こちらの二つだけですと 下記の二つが表示されます。 hoge BoughtProduct object (13) よろしくお願いいたします。
Mitsu_

2021/05/28 00:54 編集

quickquip様 メルカリもどきを作っており、 そのユーザーが購入した商品だけを表示する一覧画面を作るためです。 よろしくお願いいたします
退会済みユーザー

退会済みユーザー

2021/05/28 01:31

あ、いつの間にか問題解決されていたんですね〜 うまくいってよかったです!!
Mitsu_

2021/05/28 08:00

誠にありがとうございました。????‍♂️
guest

回答1

0

ベストアンサー

views.py では商品は必ず1件だけ取得する

template では複数の商品を表示する
となっていて食い違いがあります。

問題なのは、質問からは、どちらが意図に沿っているのかが判断できないことです。
こういうコードを書きました、エラーになりました、どう直せばいいでしょう、ではコードの目指す先がわからないのです。


「一覧画面」というワードが出るならあとあと複数商品を表示したいのでしょうから、今は

python

1 return render(request, 'buy_products.html',context={ 2 'products':products, 3 4 'bought_product':bought_product 5 })

から

python

1 return render(request, 'buy_products.html',context={ 2 'products': products, 3 'bought_product': [bought_product] 4 })

にしたらいいんじゃないでしょうか。

投稿2021/05/28 01:02

編集2021/05/28 01:16
quickquip

総合スコア11235

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mitsu_

2021/05/28 01:10

誠にありがとうございます。 次回からは意図がわかるように書きます。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問