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

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

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

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

Python

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

Q&A

解決済

1回答

1547閲覧

【Django・Pagination】ListViewに絞り込み検索後の結果を表示する際に、1ページに表示する件数を制限できない。

azuapricot

総合スコア2341

Django

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

Python

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

0グッド

0クリップ

投稿2019/10/21 05:52

いつもお世話になっております。

早速本題に入らせていただきます。

現在下記サイトなどを参考にして、DjangoとPythonを用いてWebアプリケーションを開発しているのですが、
【Django】ListViewの検索画面にページを分けたリスト表示(ページネーション)の実装をしていく
Django、ページング処理まとめ

絞り込み検索後のデータをListViewに表示する際、
paginate_by に設定した件数を無視して 1ページに全件表示 されてしまいます。

以下が現在のコードになります。


Python

1# views.py 2 3class TestView(PaginationMixin, ListView): 4 model = Test 5 paginate_by = 10 6 context_object_name = 'result' 7 template_name = 'test.html' 8 9 def post(self, request, *args, **kwargs): 10 form_value = { 11 'date_start': self.request.POST.get('date_start', None), 12 } 13 request.session['form_value'] = form_value 14 self.request.GET = self.request.GET.copy() 15 self.request.GET.clear() 16 return self.get(request, *args, **kwargs) 17 18 def get_context_data(self, **kwargs): 19 context = super().get_context_data(**kwargs) 20 21 if 'form_value' in self.request.session: 22 form_value = self.request.session['form_value'] 23 # Formから検索条件を取得 24 date_start = form_value['date_start'] 25 # 絞り込み検索 26 obj = self.model.objects.filter( 27 date_start__gte=datetime.strptime(date_start, '%Y/%m/%d')) 28 # Paginateオブジェクトを取得 29 page_obj = paginate_queryset(self, obj, self.paginate_by) 30 context = { 31 "result": obj, 32 "result_size": len(obj), 33 "page_obj": page_obj, 34 "date_start": date_start, 35 } 36 37 return context 38 39 40def paginate_queryset(self, queryset, page_size): 41 # Paginator 42 paginator = Paginator(queryset, page_size) 43 page = self.request.GET.get('page') 44 page_obj = paginator.page(page) 45 page_obj.pages = 3 46 47 return page_obj

HTML

1<!-- Template:test.html --> 2{% for data in result %} 3 <tr> 4 <td>{{ data.title }}</td> 5 <td>{{ data.date_start|date:"Y/m/d" }}</td> 6 </tr> 7{% endfor %}

現状

絞り込み検索の結果を画面に表示することはできているのですが、
検索結果が1000件あった場合 1ページに1000件全て表示 されてしまいます。

散々調べて色々コードを変えては見ましたがどうしても 1ページに10件だけ表示する 、という一見単純なことができません・・・。

お時間ある方で解決方法等ご存知の方いらっしゃいましたらご助力頂けますと幸いです。

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

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

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

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

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

t_obara

2019/10/21 06:55

paginate_queryset が呼び出されているか確認はされましたか?
guest

回答1

0

自己解決

下記のサイトを参考に、views.pyをガラッと変えたところ、問題なく1ページに10件表示できるようになりました。

20130904
Djangoのクラスベース汎用ビューでペジネータのメモ

Python

1#修正後の views.py 2 3class TestView(PaginationMixin, ListView): 4 model = Test 5 paginate_by = 10 6 context_object_name = 'result' 7 template_name = 'test.html' 8 9 def post(self, request, *args, **kwargs): 10 form_value = { 11 'date_start': self.request.POST.get('date_start', None), 12 } 13 request.session['form_value'] = form_value 14 15 self.request.GET = self.request.GET.copy() 16 self.request.GET.clear() 17 18 return self.get(request, *args, **kwargs) 19 20 def get_context_data(self, **kwargs): 21 context = super().get_context_data(**kwargs) 22 if 'form_value' in self.request.session: 23 form_value = self.request.session['form_value'] 24 date_start = form_value['date_start'] 25 context["date_start"] = date_start 26 return context 27 28 def get_queryset(self): 29 # データの取得処理をget_querysetに記述した 30 if 'form_value' in self.request.session: 31 form_value = self.request.session['form_value'] 32 date_start = form_value['date_start'] 33 obj = Test.objects.filter( 34 date_start__gte=datetime.strptime(date_start, '%Y/%m/%d')) 35 return obj

get_context_data と get_queryset の使いどころがよくわかっていなかったのが敗因・・・?

勉強が足りませんね、精進します

投稿2019/10/21 06:39

azuapricot

総合スコア2341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問