teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

回答を修正

2020/04/18 11:32

投稿

hasami
hasami

スコア1277

answer CHANGED
@@ -24,14 +24,18 @@
24
24
  ctx = super().get_context_data(**kwargs)
25
25
  pk = self.request.GET.get('pk', None)
26
26
  if pk:
27
+ ctx['current_book'] = get_object_or_404(Book, pk=int(id))
28
+ else:
29
+ ctx['current_book'] = ctx['object_list'].first()
30
+ return ctx
31
+ def get(self, request, *args, **kwargs):
32
+ pk = self.request.GET.get('pk', None)
33
+ if pk:
27
34
  try:
28
- id = int(pk)
35
+ _ = int(pk)
29
- ctx['current_book'] = get_object_or_404(Book, pk=id)
30
36
  except ValueError:
31
37
  return HttpResponseBadRequest()
32
- else:
33
- ctx['current_book'] = ctx['object_list'].first()
38
+ return super().get(request, *args, **kwargs)
34
- return ctx
35
39
 
36
40
  # in books/urls.py
37
41
  from .views import BookList

3

サンプルの改善

2020/04/18 11:32

投稿

hasami
hasami

スコア1277

answer CHANGED
@@ -20,14 +20,17 @@
20
20
  from .models import Book
21
21
  class BookList(generic.ListView):
22
22
  model = Book
23
-
24
23
  def get_context_data(self, **kwargs):
25
- """GETパラメーターのpkをidに持つBookが存在しな場合は404"""
24
+ ctx = super().get_context_data(**kwargs)
26
25
  pk = self.request.GET.get('pk', None)
26
+ if pk:
27
+ try:
27
- if pk is None:
28
+ id = int(pk)
29
+ ctx['current_book'] = get_object_or_404(Book, pk=id)
30
+ except ValueError:
28
- return HttpResponseBadRequest()
31
+ return HttpResponseBadRequest()
29
- ctx = super().get_context_data(**kwargs)
32
+ else:
30
- ctx['current_book'] = get_object_or_404(Book, pk=pk)
33
+ ctx['current_book'] = ctx['object_list'].first()
31
34
  return ctx
32
35
 
33
36
  # in books/urls.py

2

サンプルの修正

2020/04/18 11:08

投稿

hasami
hasami

スコア1277

answer CHANGED
@@ -33,7 +33,7 @@
33
33
  # in books/urls.py
34
34
  from .views import BookList
35
35
  urlpatterns = [
36
- path('', BookList.as_view, name='book-list'),
36
+ path('', BookList.as_view(), name='book-list'),
37
37
  ]
38
38
 
39
39
  # in <project>/urls.py

1

サンプルを追加

2020/04/18 05:57

投稿

hasami
hasami

スコア1277

answer CHANGED
@@ -2,4 +2,59 @@
2
2
 
3
3
  ジェネリックビューは、一般的によく使用されるパターンを簡易に実装するための仕組みです。
4
4
 
5
- アプリ固有の仕様を満たすビューは、ListViewやDetailViewを上記で提示したようにカスタマイズするか、TempleteViewで実装します。
5
+ アプリ固有の仕様を満たすビューは、ListViewやDetailViewを上記で提示したようにカスタマイズするか、TempleteViewで実装します。
6
+
7
+ (ミスがあるかもしれませんが・・・)下記のように実装すれば、下に示したURLで詳細とリストが表示されるはずです。
8
+ URL: http://127.0.0.1:8000/books/?pk=1
9
+
10
+ ```python
11
+ # in books/models.py
12
+ from django.db import models
13
+ class Book(models.Model):
14
+ title = models.CharField(max_length=80)
15
+
16
+ # in books/views.py
17
+ from django.views import generic
18
+ from django.http.response import HttpResponseBadRequest
19
+ from django.shortcuts import get_object_or_404
20
+ from .models import Book
21
+ class BookList(generic.ListView):
22
+ model = Book
23
+
24
+ def get_context_data(self, **kwargs):
25
+ """GETパラメーターのpkをidに持つBookが存在しな場合は404"""
26
+ pk = self.request.GET.get('pk', None)
27
+ if pk is None:
28
+ return HttpResponseBadRequest()
29
+ ctx = super().get_context_data(**kwargs)
30
+ ctx['current_book'] = get_object_or_404(Book, pk=pk)
31
+ return ctx
32
+
33
+ # in books/urls.py
34
+ from .views import BookList
35
+ urlpatterns = [
36
+ path('', BookList.as_view, name='book-list'),
37
+ ]
38
+
39
+ # in <project>/urls.py
40
+ from django.urls import path, include
41
+ urlpatterns = [
42
+ path('books/',include("books.urls")),
43
+ ]
44
+ ```
45
+
46
+ ```html
47
+ # in books/templates/books/book_list.html
48
+ <html>
49
+ <body>
50
+ <div>{{ current_book.title }}</div>
51
+ <div>
52
+ <table>
53
+ {% for book in object_list %}
54
+ <tr><td>{{ book.title }}</td></tr>
55
+ {% endfor }
56
+ </table>
57
+ </div>
58
+ </body>
59
+ </html>
60
+ ```