回答編集履歴

1

コメントに対する返信として「追記 1 」を追加しました。

2019/05/29 00:44

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -37,3 +37,149 @@
37
37
 
38
38
 
39
39
  お求めの答えにはなっていないかもしれません。もし「代わりにコードを書いてほしい」というご要望をお持ちであれば、他の方からの回答を待ってみてください。ご参考になれば幸いです。
40
+
41
+
42
+
43
+ ### 追記 1
44
+
45
+
46
+
47
+ > まだまだ時間がかかりそうですが、まずは頂いた回答を元に、関数ベースで投稿画面と一覧表示画面を分けたviewを作ろうと思っています。
48
+
49
+
50
+
51
+ 以下、 function-based view での書き方のイメージです。ご参考になさってください。
52
+
53
+
54
+
55
+ あくまでイメージですが、投稿一覧ページは次のような感じで書くことになるでしょうか。
56
+
57
+
58
+
59
+ ```python
60
+
61
+ from django.core.paginator import Paginator
62
+
63
+ from django.shortcuts import get_object_or_404, render
64
+
65
+
66
+
67
+ from .models import Thread, Post
68
+
69
+
70
+
71
+
72
+
73
+ def post_list(request, pk):
74
+
75
+ """特定のスレッドの投稿を一覧表示する
76
+
77
+
78
+
79
+ 引数の `pk` はスレッドの `pk` を指すので要注意
80
+
81
+ """
82
+
83
+ per_page = 20
84
+
85
+
86
+
87
+ thread = get_object_or_404(Thread, pk=pk)
88
+
89
+ post_list = Post.objects.filter(thread=thread)
90
+
91
+
92
+
93
+ # ページめくり機能をサポートする
94
+
95
+ # (ページめくり機能が不要な場合はこの 3 行は削除してください)
96
+
97
+ paginator = Paginator(post_list, per_page)
98
+
99
+ page = request.GET.get('page')
100
+
101
+ post_list = paginator.get_page(page)
102
+
103
+
104
+
105
+ context = {'post_list': post_list}
106
+
107
+ return render(request, 'bbs/post.html', context)
108
+
109
+ ```
110
+
111
+
112
+
113
+ 一方の投稿作成ページは次のような感じになるかと思います。
114
+
115
+
116
+
117
+ ```python
118
+
119
+ from django.shortcuts import get_object_or_404, redirect, render
120
+
121
+
122
+
123
+ from .models import Thread
124
+
125
+ from .forms import PostForm
126
+
127
+
128
+
129
+
130
+
131
+ def post_create(request, pk):
132
+
133
+ """特定のスレッドにひもづいた投稿を作成する
134
+
135
+
136
+
137
+ 引数の `pk` はスレッドの `pk` を指すので要注意
138
+
139
+ """
140
+
141
+ thread = get_object_or_404(Thread, pk=pk)
142
+
143
+ form = PostForm(request.POST or None)
144
+
145
+
146
+
147
+ # フォームが送信されて、なおかつその値が正しい場合は投稿データを登録してリダイレクト
148
+
149
+ if form.is_valid():
150
+
151
+ post = form.save(commit=False)
152
+
153
+ post.thread = thread
154
+
155
+ post.save()
156
+
157
+ return redirect('bbs:post', pk=thread.pk)
158
+
159
+
160
+
161
+ context = {'form': form}
162
+
163
+ return render(request, 'bbs/post.html', context)
164
+
165
+ ```
166
+
167
+
168
+
169
+ `post_list()` の中にあるページめくり機能の部分については不要であれば削除してください(数行そのまま削除するだけでよいはず、です)。ページめくり機能を使われたい場合は、公式ドキュメントの次の箇所を参照された上でご利用になるとよろしいかと思います。
170
+
171
+
172
+
173
+ - [Pagination | Django documentation | Django](https://docs.djangoproject.com/en/2.2/topics/pagination/#using-paginator-in-a-view)
174
+
175
+
176
+
177
+ これらの view が個別にうまく動くことが確認できたら、続いてこれらのロジックを統合してひとつにすれば `PostCreateAndListView` 相当の view が完成するものと思います。
178
+
179
+
180
+
181
+ 統合するときの考え方としては、 `post_create()` の方をベースに「 `post_list()` にあって `post_create()` に無いコンテキスト変数」をそこに追加していく、という方向で考えられるとおそらくスムーズです。
182
+
183
+
184
+
185
+ (このコード ↑ はあくまでアイデアをお伝えするためのものなので、私の手元で動作確認したわけではありません。細かいところが間違っている可能性もありますので、コピペでそのまま利用するのではなくアイデアの参考としてお読みください)