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

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

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

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

Python

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

Q&A

解決済

1回答

3546閲覧

【Django】1つの画面で、複数のModelのデータを参照し表示したい

machiyoi

総合スコア7

Django

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

Python

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

0グッド

0クリップ

投稿2020/02/02 14:22

編集2020/02/02 22:47

前提・実現したいこと

Djangoを用いて、ユーザーがコミュニケーションの場を提案し、参加する、
という機能を作っています。

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

募集詳細画面で、募集内容を取得し、テンプレートで表示することはできましたが、
その募集内容に紐づく、参加者の情報とユーザーの情報を習得する方法が分かりません。

該当のソースコード

models.py

python

1class Bosyu(models.Model): 2 bosyu_seq = models.AutoField(primary_key=True) 3 bosyu_kbn = models.CharField(max_length=1) 4 bosyu_limit = models.DateTimeField() 5 venue = models.CharField(max_length=50) 6 venue_datetime = models.DateTimeField() 7 title = models.CharField(max_length=100) 8 main_text = models.TextField(max_length=1000) 9 bosyu_people_cnt = models.IntegerField() 10 bosyu_peple_kbn = models.CharField(max_length=1) 11 status = models.CharField(max_length=1) 12 post_datetime = models.DateTimeField(auto_now=True) 13 post_user_id = models.CharField(max_length=4) 14 update_datetime = models.DateTimeField(auto_now=True) 15 update_user_id = models.CharField(max_length=4) 16 delete_flg = models.CharField(max_length=1) 17 18 class Meta: 19 ordering = ['-bosyu_limit'] 20 21 def __str__(self): 22 return self.title 23 24 25class Join(models.Model): 26 join_seq = models.AutoField(primary_key=True) 27 bosyu_seq = models.ForeignKey(Bosyu, db_column='bosyu_seq', on_delete=models.CASCADE) 28 join_user_id = models.CharField(max_length=4) 29 join_app_datetime = models.DateTimeField(auto_now=True) 30 delete_flg = models.CharField(max_length=1) 31 32 def __int__(self): 33 return self.join_seq 34 35 36class User(models.Model): 37 user_id = models.CharField(max_length=4) 38 emp_no = models.CharField(max_length=4) 39 password = models.CharField(max_length=12) 40 name = models.CharField(max_length=50) 41 admin_flg = models.CharField(max_length=1) 42 43 def __str__(self): 44 return self.name

views.py

python

1class BosyuListView(ListView): 2 model = Bosyu 3 template_name = 'blog/index.html' 4 5 def index(request): 6 bosyu_list = Bosyu.objects.all() 7 context = {'bosyu_list': bosyu_list} 8 return render(request, 'blog/index.html', context) 9 10class BosyuDetailView(DetailView): 11 model = Bosyu 12 13 def get_object(self, queryset=None): 14 obj = super().get_object(queryset=queryset) 15 return obj

試したこと

外部キーが設定されている子テーブルは取得した時点で親もINNER JOIINされている、
という情報を見て、

class BosyuDetailView(DetailView): model = Join def get_object(self, queryset=None): obj = super().get_object(queryset=queryset) return obj

とすれば両方の値が取れるのかと思いましたが、
詳細画面を表示する際にTemplateDoesNotExistエラーとなります。
そもそも、外部キーの設定は現在のModelsの形であっているのでしょうか?

具体的にやりたいことは、
・Bosyuのbosyu_seqに紐づくJoinのデータの取得(Bosyu:Join=1:n)
・Bosyu及びJoinのuser_idに紐づくUserデータの取得(Bosyu:User=1:1)(Join:User=1:1)

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

Python3
Django2

初学者故、基本的なことが理解できておらず大変恐れ入りますが、
ご教示いただけますと幸いです。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
Viewsやcontextの理解が足りませんでした。

python

1def detail(request,bosyu_seq): 2 bosyuObj = Bosyu.objects.get(bosyu_seq = bosyu_seq) 3 joinList = Join.objects.filter(bosyu_seq = bosyu_seq) 4 context = {'joinList':joinList,'bosyuObj':bosyuObj,} 5 return render(request,'blog/bosyu_detail.html',context)

関数を作り、それぞれのデータを取得してコンテキストに登録して渡すことで実現できました。

投稿2020/02/04 13:20

machiyoi

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問