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

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

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

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

Q&A

解決済

2回答

1479閲覧

urlの変数をViewsに取り込めない

setuna0531

総合スコア128

Django

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

0グッド

0クリップ

投稿2020/09/03 05:14

編集2020/09/03 08:44

#現状
urlへ渡した変数をviewsに取込処理を行いたいと思っています。
しかし、実際にはデータがあるはずなのですが、404エラーが返ってくる状況です。

#エラー内容

Page not found (404) Request Method: GET Request URL: http://127.0.0.1:8000/list/11/item_update/9/ Raised by: app.views.item_Update No item found matching the query

エラーメッセージの最後に「No item found matching the query」と出ているので、
itemがうまく取り込めていない状況です。

#ソース

urls

1path('list/<int:pk>/item_update/<int:id>/', views.Item_Update.as_view(), name='item_update'), 2 3pkはカテゴリのpk, idはアイテムのpk

views

1class Item_Update(generic.UpdateView): 2 template_name = 'item_update.html' 3 model = Item 4 fields = ('order', 'itemname', 'price') 5 6 def get_context_data(self, **kwargs): 7 context = super().get_context_data(**kwargs) 8 context['category'] = get_object_or_404(Category, pk=self.kwargs['pk']) 9 context['item'] = get_object_or_404(Item, pk=self.kwargs['id']) 10 return context 11 12 def get_success_url(self): 13 return reverse_lazy('item_list',kwargs={"pk":self.kwargs["pk"]})

#試したこと
Modelを確認する限り、itemのpk=9は存在しています。
また、updateする前に一覧を表示していますが、その時にはカテゴリpkをもとに
一覧を表示できているので、urlから引数を引っ張ってくる処理は間違っていないと思われます。

update内でItemが取り込めていないのかと思い、下記のソースを追加して受け取れているか
確認しましたが、データはしっかり受け取れているようです。

views

1 def get_queryset(self): 2 item = self.item = get_object_or_404(Item, id=self.kwargs['id']) 3 queryset = super().get_queryset().filter(id=item) 4 return queryset

結果

TypeError at /list/11/item_update/9/ Field 'id' expected a number but got <Item: カテゴリ名 アイテム名>.

#最後に
2日間調べましたが、うまくいかないので投稿しました。
助言をお願いします。

#追記
htmlを載せていませんでした。
下記のタグにてupdate画面に移行しています。

html

1<a href="{% url 'item_update' pk=category.pk id=item.id %}">表示している項目<a>

#追記2
llr114様の実行結果です。
※menu_listとかになっていますが、投稿のソースはitemに変更しています。

update処理にて
イメージ説明

listにて(pkが受け取れているか確認)
イメージ説明

update処理の中でquerysetと一緒に流した場合(試したことと同じ処理の中に記載)
※404エラー以外で無理やり実行させてる状況です。
イメージ説明

#追記3
menu_list (質問時のlistのこと)

html

1{% extends 'base.html' %} 2 3{% block customcss %} 4{% endblock customcss %} 5 6{% block header %} 7<div class="d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom shadow-sm"> 8 <h3 class="my-0 mr-md-auto font-weight-normal">{{ category.shopname }}</h3> 9 <p>カテゴリ名:{{ category.categoryname }}</p> 10 <a type="button" class="btn btn-outline-success" href="{% url 'menu_create' category.pk %}">メニュー作成</a> 11 </div> 12{% endblock header %} 13 14{% block content %} 15<body style="background-color:gainsboro"> 16<div class="container"> 17 {% for menu in menu %} 18 <div class="alert alert-light" role="alert"> 19 <a href="{% url 'menu_update' pk=category.pk id=menu.pk %}">{{menu.order}} {{menu.menuname}} {{menu.price}}</a> 20 </div> 21</body> 22 {% endfor %} 23</div> 24{% endblock content %}

menu_update (質問時のitem_update)

html

1{% extends 'base.html' %} 2 3{% block header %} 4{% endblock header %} 5 6{% block content %} 7<body style="background-color:paleturquoise"> 8<form action="" method="POST" enctype="multipart/form-data" class="ml-1">{% csrf_token %} 9 <p>順序:{{ form.order }}</p> 10 <p>メニュー名:{{ form.menuname }}</p> 11 <p>値段:{{ form.price }}</p> 12 <input class="btn btn-primary" type="submit" value="更新"> 13 <a class="btn btn-secondary" href="{% url 'menu_list' category.pk %}">cancel</a> 14</form> 15</body> 16{% endblock content %}

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

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

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

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

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

llr114

2020/09/03 06:45

回答依頼ありがとうございます。 context['category'] = get_object_or_404(Category, pk=self.kwargs['pk']) の上に print(self.kwargs['pk']) print(self.kwargs['id']) を追加してそれぞれ正しく出力されてるかを確認してみて下さい。 また、その下に print(Category.objects.get(id='11')) print(Item.objects.get(id='9')) とやって、該当するIDでそれぞれの要素が取得できるのかを確認してみてください。
setuna0531

2020/09/03 07:33

llr114様 ご回答ありがとうございます。 言われた通り行ったのですが、404エラーが表示されてしまうため、 ターミナルに実行データが表示されませんでした。 「GET /list/11/item_update/9/ HTTP/1.1" 404」と出るだけ。 item_listの方で、pkがうまく拾えているか確認したところ、 しっかりと表示されました。 pkのとき:11 11のとき:おすすめ 404エラーに入らないようにしたかったので、get_object_or_404(モデル名, データ指定) ではなく、モデル名.objects.get(データ指定)としましたが、それでも404エラーと なってしまうため、update時にどのデータを拾おうとしているか見ることが出来ませんでした。 結果としてはupdateの処理で要素が確認できない状況です。
setuna0531

2020/09/03 07:35

検証時は、get_context_date のcontext['']はコメントアウトして検証しています。
llr114

2020/09/03 07:36

申し訳ないですが、ちょっと様子がいまいち掴めていないので、上記を実行した際のターミナルのスクリーンショットをいただくことは可能でしょうか?
setuna0531

2020/09/03 07:54

追記2でスクリーンショットを上げました。 menu_などの記載になっていますが、わかりやすいように 投稿時にitemに変えいます。
setuna0531

2020/09/04 02:07

llr114様 こんにちは。 色々調べていますが現状も動かない状況が続いています。 ご教授お願い致します。
llr114

2020/09/04 02:13

確認ですが、views.pyの context['item'] = get_object_or_404(Item, pk=self.kwargs['id']) は何のためでしょうか? テンプレート上で使用している箇所が見つからなかったので、確認です。
setuna0531

2020/09/04 02:23

llr114様 特に意味はありません。 実際にデータが来ていないのか?と思っていたのでテンプレートで 確認しようと思い追加しただけとなっています。(試しているときの消し忘れです) 紛らわしいことしてすみません。
llr114

2020/09/04 02:34

その場合、pk = ItemのID、id = CategoryのIDにしたほうがいいかと思います。 他の回答者様から回答があったように、unpdateformはpkの値を元にオブジェクトを取得するので、今のままだとcategory用のIDでItemを取得しようとしてしまっています。 path('list/<int:pk>/item_update/<int:id>/', views.Item_Update.as_view(), name='item_update'), pkはカテゴリのpk, idはアイテムのpk ここの部分です。
setuna0531

2020/09/04 02:50

なるほどですね。 今やりたいことはItemの中に変数として受け取ったcategoryが欲しいので、 pkに与えるものを間違えていましたね!すみません。 今上記の通りlistまでさかのぼりcategoryをid、itemをpkにしたらうまく動きました! お手数をおかけしますが、今頂いた内容を回答としていただけますでしょうか?
llr114

2020/09/04 02:57

承知いたしました。
guest

回答2

0

ベストアンサー

その場合、pk = ItemのID、id = CategoryのIDにしたほうがいいかと思います。
他の回答者様から回答があったように、unpdateformはpkの値を元にオブジェクトを取得するので、今のままだとcategory用のIDでItemを取得しようとしてしまっています。

path('list/<int:pk>/item_update/<int:id>/', views.Item_Update.as_view(), name='item_update'), pkはカテゴリのpk, idはアイテムのpk

ここの部分です。

投稿2020/09/04 02:57

llr114

総合スコア203

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

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

setuna0531

2020/09/04 08:37

llr114様 ご回答ありがとうございました。 私が理解していないがためにお時間を割いてしまいすみません。 またわからないことがありましたらお聞きするかもしれませんがその時はよろしくお願いいたします。
guest

0

UpdateViewなど、SingleObjectMixinから派生したビューは、URIのパラメーターpkは特別な意味を持ち、主キーの値を指定するために使用します。

よって、list/<int:pk>/item_update/<int:id>/のエンドポイントに対して、/list/11/item_update/9/でリクエストした場合、Djangopkである11を主キーに持つItemモデルインスタンスを取得しようとします。

更新したいモデルの主キーをしているため、カテゴリモデルの主キーをビューに渡す必要はないと思います。

python

1# urls.py 2# /items/update/9/など 3path('items/update/<pk:id>/', views.ItemUpdateView.as_view(), name='item-update'), 4 5# views.py 6class ItemUpdateView(generic.UpdateView): 7 model = Item 8 fields = ('order', 'itemname', 'price') 9 10 def get_success_url(self): 11 return reverse('item_list',kwargs={'pk':self.object.id})

また、item_update.htmlitem_form.htmlに変更します。

投稿2020/09/03 07:49

hasami

総合スコア1277

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

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

setuna0531

2020/09/03 08:11

ご回答ありがとうございます。 UpdateViewの特性について教えて下さりありがとうございます。 全然知らない情報でしたのでとても勉強になります。 また、ご回答いただいた内容に変更をしてみたのですが、 投稿したエラー内容と同様のエラーが出てしまいます。 (listのタグで指定しているid=item.idは消して実行しました) 状況は変わらず投稿内容と同じエラーが表示されます。
hasami

2020/09/03 08:32

テンプレートを質問に追加してもらえますか?
setuna0531

2020/09/03 08:45

hasami様 追記にてテンプレートを記載しました。 よろしくお願いいたします。
setuna0531

2020/09/04 02:07

hasami様 こんにちは。 色々調べていますが現状も動かない状況が続いています。 ご教授お願い致します。
setuna0531

2020/09/04 08:36

hasami様 ご回答頂き誠にありがとうございました。 おかげ様で無事問題を打破することが出来ました。 また困ったことがありましたら手助けをお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問