質問: ### 前提・実現したいこと Python Djangoを勉強中です。公式チュートリアルをこなした程度の状態です。 日毎のデータを格納するModelを定義して、それをカレンダーのように1月分一覧表示したいです。 その一覧画面では日毎のデータを選択して個別の日毎データの編集画面に遷移したいです。 全ての日付に日毎データがあるのであれば、 Viewsクラスで1ヵ月分のクエリーを作ってそれで得られたModelインスタンスリストをQuerySetにセットしてやればよいです。 しかし最初は日毎データが存在しないのでクエリーだと当然0件もしくは入力したことのある日付の日毎データだけがQuerySetにセットされます。それをカレンダー表示しようと思ったら単純に考えるとHTMLの方で1ヵ月分のデータが揃っているか、揃っていないなら空行を表示する、ようなコーディングが必要になります。 できればサーバーロジック側で処理したいので、まずはQuerySetの中にダミーデータ(DBには存在しない空行データ)を差し込んでやろうというアプローチで考えましたが、QuerySetにデータを入れるにはどうもpkが必要?みたいでうまくいきませんでした。ネット上にもサンプルは見つけられませんでした。 クエリの段階で足りない日付データインスタンスをcreateしてやれば多分うまくいくのですが、この方法だと本来データが存在しない日付のデータがDB上に登録されてしまうと思います。しかも表示のクエリの段階で。 次に、QuerySetではなく、コンテキストデータとしてModelインスタンスのリストでも返してやろうと思いましたが、この方法でもpkエラーが発生してしまいます。恐らく一覧画面から日毎データの詳細画面か編集画面へのリンクのところでpkを使っているからです。 今回のような場合、Djangoではどのようなアプローチで実現するのが妥当でしょうか。ヒントを頂きたく、、、 また、今回のようなこういう場合はどうすれば?という疑問がネット検索では一切解決しないので、ヒントとは別に書籍や調べ方の紹介もして頂ければ幸いです。 よろしくお願いいたします。 ### 補足情報(FW/ツールのバージョンなど) Python 3.7.0 Django 2.1.4
回答: 「日毎のデータを格納する model があって、その一覧を月単位で表示したい」ということですね。 私の理解が間違っていなければ、難しく考えすぎていらっしゃるのではないかと思います。 Django では、というよりはプログラミングの一般論としてのお話になりますが、 model の一覧(= queryset )からカレンダー形式のデータを構築するためのループを書けばよいのではないかと思います。 擬似コードは次のような感じになるでしょうか( ★の部分が上の「ループ」です)。 ``` views.py: // クライアントサイドから渡された対象年月を取得 // 対象年月の model の queryset を取得 // ★: 対象年月の日付一覧を取得 // ★: queryset に対してループを回して、「日付: イベント一覧」のデータを作成 // 「日付: イベント一覧」のデータを template に渡す template: // view から渡された「日付: イベント一覧」のデータに対してループを回しカレンダーを描画 ``` (実際に書かれたコードを掲載されると、具体的なヒントがもらえやすくなると思います)