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

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

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

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

Python

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

Q&A

解決済

1回答

1086閲覧

Djangoでwebアプリ作れなくない?

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

1クリップ

投稿2020/04/18 03:32

Modelからデータを取ってリスト表示はリストに適したlistviewsを使って、単体の表示はdetailviewで......

では両方をまとめて表示するhtml(詳細とリストが混在)が作れないじゃんって思うんですが

もし、そうならweb公開でリストと詳細を別々に表示しなきゃいけないですよね....

どこの資料もDetailview→detail.html
Listview→list.html

↑これでどこが汎用性あるんでしょうか?w

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/18 04:58

ご回答ありがとうございます! 確かにそうですね.....まだ数日しか触ってないのに変なこと言って本当にすみませんでした..... もし、よろしければ詳細リストを両方表示しているサイトのURLを送っていただけませんでしょうか?
guest

回答1

0

ベストアンサー

ListViewのget_context_dataメソッドをオーバーライドして、詳細を表示したいオブジェクトをコンテキストに設定すれば、リストと詳細を表示できます。

ジェネリックビューは、一般的によく使用されるパターンを簡易に実装するための仕組みです。

アプリ固有の仕様を満たすビューは、ListViewやDetailViewを上記で提示したようにカスタマイズするか、TempleteViewで実装します。

(ミスがあるかもしれませんが・・・)下記のように実装すれば、下に示したURLで詳細とリストが表示されるはずです。
URL: http://127.0.0.1:8000/books/?pk=1

python

1# in books/models.py 2from django.db import models 3class Book(models.Model): 4 title = models.CharField(max_length=80) 5 6# in books/views.py 7from django.views import generic 8from django.http.response import HttpResponseBadRequest 9from django.shortcuts import get_object_or_404 10from .models import Book 11class BookList(generic.ListView): 12 model = Book 13 def get_context_data(self, **kwargs): 14 ctx = super().get_context_data(**kwargs) 15 pk = self.request.GET.get('pk', None) 16 if pk: 17 ctx['current_book'] = get_object_or_404(Book, pk=int(id)) 18 else: 19 ctx['current_book'] = ctx['object_list'].first() 20 return ctx 21 def get(self, request, *args, **kwargs): 22 pk = self.request.GET.get('pk', None) 23 if pk: 24 try: 25 _ = int(pk) 26 except ValueError: 27 return HttpResponseBadRequest() 28 return super().get(request, *args, **kwargs) 29 30# in books/urls.py 31from .views import BookList 32urlpatterns = [ 33 path('', BookList.as_view(), name='book-list'), 34] 35 36# in <project>/urls.py 37from django.urls import path, include 38urlpatterns = [ 39 path('books/',include("books.urls")), 40]

html

1# in books/templates/books/book_list.html 2<html> 3 <body> 4 <div>{{ current_book.title }}</div> 5 <div> 6 <table> 7 {% for book in object_list %} 8 <tr><td>{{ book.title }}</td></tr> 9 {% endfor } 10 </table> 11 </div> 12 </body> 13</html>

投稿2020/04/18 04:17

編集2020/04/18 11:32
hasami

総合スコア1277

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

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

退会済みユーザー

退会済みユーザー

2020/04/18 11:20

ご返信ありがとうございます。 上記の内容を打ち込んだところ context must be a dict rather than HttpResponseBadRequest というエラーが出てしまいました...
hasami

2020/04/18 11:33

ああ、get_context_dataは辞書を返さないといけないのに、Responseを返却している箇所がありました。 getメソッドでGETパラメーターのpkの値を検証するように、回答を修正しました。
退会済みユーザー

退会済みユーザー

2020/04/19 12:57

出来ました、ありがとうございます! Views.pyのget_context_dataのpkの場合分けの.first()はどういう意味でしょうか?
hasami

2020/04/19 22:47

GETパラメーターでpkが指定されていない場合に、ListViewが派生するMultipleObjectMixinが取得するクエリセットの先頭のアイテムを取得するものです。
退会済みユーザー

退会済みユーザー

2020/04/20 05:09

Pkは、プロジェクトのurlsでint:pkを入れればif pk:の上の処理がされるんでしょうか? 度重なる質問への回答本当にありがとうございます。
退会済みユーザー

退会済みユーザー

2020/04/20 11:51

そうなんですね......どうやら自分はurlの呼び出し内容も理解できてないみたいですね。 今までプライマリーキーの関連付けはurlsのint:pkを追加すればいいだけだと思ってました。 本当にありがとうございます。最後に今回のようなList、DetailViewなどのカスタマイズに参考になる資料やページurlがありましたら教えていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問