回答編集履歴

1

dfsdfsg

2020/04/28 07:04

投稿

chapin
chapin

スコア80

test CHANGED
@@ -143,3 +143,141 @@
143
143
 
144
144
 
145
145
  *最近djangoを触っていないので細かいところでエラーが出てしまう恐れがありますが、この考え方は間違いないと思われます。
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+ 追記:
154
+
155
+
156
+
157
+ 質問者様が使われているのはClassBasedViewの中のCreateViewを使っていることを失念していました。こちらについての私なりの考えを述べ、サンプルコードを書いてみます。
158
+
159
+
160
+
161
+ CreateViewを始めListView, DetailView, UpdateView等はすべてViewを継承して作られたものです。これらは、どのようなロジックで動くか予め設定してあります。だから素早く開発したい場合には便利ですが、ロジックに外れた複雑なことをしようとする場合には自分で色々CreateViewのロジックを書き換えなければなりません。
162
+
163
+ 一方、Viewはロジックをすべて自分で書かなければいけませんが自由度が高いです。基本的にこちらでwebアプリを作る方が凝った物が作れると思われます。
164
+
165
+
166
+
167
+ まだCreateViewの構造を把握されていないと思われるのでCreateViewの各メソッドをオーバーライドするよりも、Viewクラスを利用して書く方法を提示します。
168
+
169
+
170
+
171
+ ```python
172
+
173
+ from ***.*** import PostForm
174
+
175
+ from django.views.generic import View
176
+
177
+
178
+
179
+ class ItemCreateView(View):
180
+
181
+ #ユーザーがGETを実行したら以下のメソッドが実行される
182
+
183
+ #ユーザーに入力フォームを表示する役割です
184
+
185
+ def get(self, request, *args, **kwargs):
186
+
187
+ context = {}
188
+
189
+ if request.user.is_anonymous:
190
+
191
+ return HttpResponse("ログインしてください")
192
+
193
+ #ユーザーにどのような入力フォームを表示させるかを準備する
194
+
195
+ form = PostForm()
196
+
197
+ context["form"] = form
198
+
199
+ return render(request, 'register/item_form.html', context)
200
+
201
+
202
+
203
+ #ユーザーがPOSTを実行したら以下のメソッドが実行される
204
+
205
+ #ユーザーの入力したデータに基づいてItemインスタンスを生成する役割です。
206
+
207
+ def post(self, request, *args, **kwargs):
208
+
209
+ context = {}
210
+
211
+ if request.user.is_anonymous:
212
+
213
+ return HttpResponse("ログインしてください")
214
+
215
+ #ユーザーの入力データの受取
216
+
217
+ form = PostForm(request.POST)
218
+
219
+ #入力内容のチェック
220
+
221
+ if form.is_valid():
222
+
223
+ item_obj = form.save(commit=False)
224
+
225
+ #ココでUserオブジェクトを追加。
226
+
227
+ item_obj.post_user = User.objects.get(username=request.user.name)
228
+
229
+ item_obj.save()
230
+
231
+ return redirect('register:top')
232
+
233
+ return redirect('ItemCreateViewの逆引き用のname')
234
+
235
+ ```
236
+
237
+
238
+
239
+ ちなみにcreateメソッドでアドバイスしましたのでcreateメソッドを使う方法も記述しておきます。
240
+
241
+ ```python
242
+
243
+
244
+
245
+ if form.is_valid():
246
+
247
+ title = form.cleaned_data['title']
248
+
249
+ content = form.cleaned_data['content']
250
+
251
+ category = form.cleaned_data['category']
252
+
253
+ user_obj = User.objects.get(username = request.user.name)
254
+
255
+ Item.objects.create(title=title, content=content, category=category, post_user=user_obj)
256
+
257
+ return redirect('register:top')
258
+
259
+
260
+
261
+ ...
262
+
263
+ ```
264
+
265
+
266
+
267
+
268
+
269
+ どう開発されているかわかりませんが、基本的にViewクラスを継承したものを作って開発するほうが最終的に何でも対応できてしまうと思います。わたしはめったにView以外のclassBasedViewを使いません。
270
+
271
+
272
+
273
+ もしViewの使い方がわからなければViewから学習を進めると遠回りのようで近道だと思います。
274
+
275
+
276
+
277
+ もしViewの使い方を勉強しても難しいようであれば、関数型Viewの知識が足りないかもしれません。
278
+
279
+ クラスベースのViewは関数型ViewのGET,POST等のTHHPメソッドによる分岐をクラスメソッドとしてget, post等に切り分けただけなので、以下のようなサイトの関数型ビューの使い方に慣れて、関数型ビューが煩雑だなと思った時にクラス型のViewに乗り換えればいいと思います。
280
+
281
+
282
+
283
+ https://djangobrothers.com/tutorials/blog_app/top_page/