質問編集履歴

1

修正

2020/08/06 22:45

投稿

Mario_11
Mario_11

スコア95

test CHANGED
@@ -1 +1 @@
1
- django UpdateViewの書き方
1
+ django UpdateViewの書き方を教えてください
test CHANGED
@@ -1,16 +1,120 @@
1
+ modelsが複数ある場合のUpdateViewの書き方について教えてください。
2
+
3
+ 現在、二つのモデルを一つのページに表示させているのですが、`CreateView`,`DetailView`,`DelateView`の三つは表示出来たのですが、`UpdateView`だけうまくいきません。
4
+
5
+ クラスで行う`UpdateView`のやり方がわからず関数にしています。
6
+
1
- UpdateViewを書いすが、更新されずに`NoneType: None`と出力されてしいます。
7
+ 編集画面に移っ時点で`NoneType: None`と表示されます。
8
+
9
+ 何かアドバイスをいただきたいです。
10
+
11
+ 参考サイトなども教えていただければ幸いです。
12
+
13
+ よろしくお願いいたします。
14
+
15
+ ```python
16
+
17
+ class ItemDetailView(DetailView):
18
+
19
+ model = Item
2
20
 
3
21
 
4
22
 
5
- ```python
23
+ def get_context_data(self, **kwargs):
6
24
 
25
+ context = super(ItemDetailView, self).get_context_data(**kwargs)
26
+
27
+ context['recomend_post'] = Item.objects.all()
28
+
29
+ context['subitem_list'] = self.object.subitem_set.filter(parent__isnull=True)
30
+
31
+ return context
32
+
33
+
34
+
35
+ # 登録画面
36
+
37
+ class ItemCreateView(LoginRequiredMixin, View):
38
+
39
+ #ユーザーがGETを実行したら以下のメソッドが実行される
40
+
41
+ #ユーザーに入力フォームを表示する役割です
42
+
43
+ def get(self, request, *args, **kwargs):
44
+
45
+ context = {}
46
+
47
+ if request.user.is_anonymous:
48
+
49
+ return HttpResponse("ログインしてください")
50
+
51
+ #ユーザーにどのような入力フォームを表示させるかを準備する
52
+
53
+ form = PostForm(request.POST or None)
54
+
55
+ context["form"] = form
56
+
57
+ context['formset'] = SubitemFormset()
58
+
59
+ return render(request, 'app/item_form.html', context)
60
+
61
+
62
+
63
+ #ユーザーがPOSTを実行したら以下のメソッドが実行される
64
+
65
+ #ユーザーの入力したデータに基づいてItemインスタンスを生成する役割です。
66
+
67
+ def post(self, request, *args, **kwargs):
68
+
69
+ context = {}
70
+
71
+ if request.user.is_anonymous:
72
+
73
+ return HttpResponse("ログインしてください")
74
+
75
+ #ユーザーの入力データの受取
76
+
77
+ form = PostForm(request.POST, request.FILES)
78
+
79
+ post = form.save(commit=False)
80
+
81
+ formset = SubitemFormset(request.POST, files=request.FILES, instance=post)
82
+
83
+ #入力内容のチェック
84
+
85
+ if form.is_valid():
86
+
87
+ item_obj = form.save(commit=False)
88
+
89
+ #ココでUserオブジェクトを追加。
90
+
91
+ item_obj.post_user = User.objects.get(email=request.user.email)
92
+
93
+ item_obj.save()
94
+
95
+ formset.save()
96
+
97
+ return redirect('app:top')
98
+
99
+ else:
100
+
101
+ context['formset'] = formset
102
+
103
+
104
+
105
+ return redirect('app:create')
106
+
107
+
108
+
109
+ # 更新画面
110
+
7
- def update_post(request, pk):
111
+ def UpdateView(request, pk):
8
112
 
9
113
  post = get_object_or_404(Item, pk=pk)
10
114
 
11
115
  form = PostForm(request.POST or None, instance=post)
12
116
 
13
- formset = CouponFormset(request.POST or None, files=request.FILES or None, instance=post)
117
+ formset = SubitemFormset(request.POST or None, files=request.FILES or None, instance=post)
14
118
 
15
119
  if request.method == 'POST' and form.is_valid() and formset.is_valid():
16
120
 
@@ -18,7 +122,7 @@
18
122
 
19
123
  formset.save()
20
124
 
21
- # topページを表示
125
+ # 編集ページを再度表示
22
126
 
23
127
  return redirect('app:top')
24
128
 
@@ -40,4 +144,22 @@
40
144
 
41
145
  return render(request, 'app/item_form.html', context)
42
146
 
147
+ class ItemDeleteView(LoginRequiredMixin, DeleteView):
148
+
149
+ model = Item
150
+
151
+ success_url = reverse_lazy('app:top')
152
+
153
+
154
+
155
+ def dispatch(self, request, *args, **kwargs):
156
+
157
+ obj = self.get_object()
158
+
159
+ if obj.post_user != self.request.user:
160
+
161
+ raise Http404("You are not allowed to edit this Post")
162
+
163
+ return super(ItemDeleteView, self).dispatch(request, *args, **kwargs)
164
+
43
165
  ```