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

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

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

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

Python

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

Q&A

解決済

2回答

275閲覧

Djangoで2つのviews.pyの関数を1つのページに表示させたい。

kotatsu2

総合スコア16

Django

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

Python

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

0グッド

0クリップ

投稿2019/01/15 13:04

編集2019/01/16 14:24

Djangoでレッスン記録を作成している、プログラム初心者です。

学生の情報ページとその学生が受講したレッスンの一覧を1枚のページに表示させたいのですが、formに項目がセットされていないなどのエラーが表示され、うまくできません。
どのようにすれば、2つのviews関数を1つのページに表示できるか教えていただけませんか?

別々のページなら、それぞれ表示させることはできています。
views.py の schedule_list と student_detail を1つのページに表示させたいです。
schedule_list(レッスン記録)には選択している学生のみの記録を絞り込んで5件だけ表示させたいです。
よろしくお願いいたします。

環境:python 3.7
Django 2.1.5
windows10

views.py def schedule_list(request): """スケジュールを降順で一覧表示.""" schedules = Schedule.objects.order_by('-lesson_date') # 降順 paginator = Paginator(schedules, 5) page = request.GET.get('page', 1) try: schedules = paginator.page(page) except (EmptyPage, PageNotAnInteger): schedules = paginator.page(1) return TemplateResponse(request, 'schedule/schedule_list.html', {'schedules': schedules}) def student_detail(request, student_id): """選択した学生の詳細を表示""" try: student = Student.objects.get(id=student_id) except Student.DoesNotExist: raise Http404 return TemplateResponse(request, 'schedule/student_detail.html', {'student': student,})
form.py from django import forms from schedule.models import Schedule from schedule.models import Student class ScheduleEditForm(forms.ModelForm):   # スケジュール用 class Meta: model = Schedule fields = ( 'student', 'lesson_date', 'article', 'content', ) class StudentEditForm(forms.ModelForm):   # 学生情報用 class Meta: model = Student fields = ( 'name', 'country', )

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

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

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

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

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

guest

回答2

0

ご返信くださりありがとうございます。

python

1schedules = Schedule.objects.filter(id=student_id).order_by('-created_at')[:5]

この記載でほぼ OK だと思うのですが、ここで検索したいのは student_id にひもづく Schedule なので、 filter(id=student_id) ではなく filter(student=student) とする必要があるものと思います。この変数 student には student_detail の中で定義されているものをお使いください。

という変更を加えると、次のような感じになるでしょうか。

python

1try: 2 student = Student.objects.get(id=student_id) 3except Student.DoesNotExist: 4 raise Http404 5 6schedules = Schedule.objects.filter(student=student).order_by('-created_at')[:5]

( model の定義がわからないので、「 ScheduleForeignKey の名前は student である」ということを form の定義から推測しています。この推測が間違っていれば、 student= のところは実際のフィールド名に読み替えてください :D )

ご質問への回答になっていますでしょうか。

投稿2019/01/17 04:06

編集2019/01/17 04:09
gh640

総合スコア1407

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

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

gh640

2019/01/17 04:08

すみません、回答に追記すべきところを、間違って別の回答として投稿してしまいました……
kotatsu2

2019/01/17 15:08

gh640さん、いつもありがとうございます。教えていただいた通りにしましたら、うまく動きました。とての助かりました。ありがとうございました。これからもよろしくお願いします。
gh640

2019/01/19 10:07

kotatsu2 さん、ご丁寧にご報告くださりありがとうございます。そうですか、よかったです!がんばってください :D
guest

0

ベストアンサー

次の 2 つの課題があるという理解で正しいでしょうか?

1:

views.py の schedule_list と student_detail を1つのページに表示させたいです。

2:

schedule_list(レッスン記録)には選択している学生のみの記録を絞り込んで5件だけ表示させたいです。

この理解が正しいという仮定のもとに以下回答させていただきますね。

1 の方は、既存の schedule_liststudent_detail を再利用する形ではなく、単純に新たな view 関数(例えば student_detail_with_schedule() )を作る形で実装されるとよいのではないかと思います。それでは何か問題がありますでしょうか?

2 の方は、 student_detail と同じような形で student_idStudent を特定できるパラメータを URL 経由で view 関数に渡してやって、それで絞り込むとよいものと思います。

...

formに項目がセットされていないなどのエラーが表示され、

コードを見せていただくかぎり、 schedule_liststudent_list には form は使われていないので、今回の課題とは別問題かなという気がします。いくつか課題があるのであればまず問題を整理されるのがよいのではないでしょうか。

投稿2019/01/16 06:22

gh640

総合スコア1407

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

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

kotatsu2

2019/01/16 15:04 編集

gh640さん、いつも教えていただいてありがとうございます。gh640さんの理解で正しいです。ページの上部に学生の詳細を、下部にレッスンの記録(日付、内容等)を一覧で表示させたいです。教えていただいた通り、student_detail_with_schedule()関数を作成してみましたが、学生のスケジュールを降順で表示させたいのですが、 schedules = Schedule.objects.filter(id=student_id).order_by('-created_at')[:5] の記載でなぜか最新の情報しか表示されません。学生の記録の一覧を最新(作成日)のものから5件表示させるには、どのように記載すればよいでしょうか? 一覧表示はviews.pyのdef schedule_list(request):をコピーしてfilterの記載部分だけを変更しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問