[Django3.0]ページ内検索のページネーションをGETメソッドで実装する

得意先一覧ページで、会社名検索のページネーションの実装について考えます。

formで method=”post”とすれば、views.pyで request.POST[‘*’]と書けば、postされた値を取得することができるのですが、取得データの数が多い場合、検索結果が1ページに収まらないケースが出てきます。

その際に、ページネーションのリンクを以下のように、data.previous_page_numberやdata.next_page_numberなどと書くと、次のページにはGETで遷移してしまうため、検索クエリが引き継がれません。

<li class="page-item">
						<a class="page-link" href="/client/1">&laquo; first</a>
					</li>
					<li class="page-item">
						<a class="page-link" href="/client/{{data.previous_page_number}}">&laquo; prev</a>
					</li>

その為、ページ内検索の場合は、methodをPOSTではなく、GETに変更します。

form

<form action="/client/1" method="get">
				<div class="form-group row">
					<div class="col-md-10">
						<input type="text" class="form-control" name="name" placeholder="検索する会社名を入力してください">
					</div>
					<div class="col-md-2">
						<button class="btn search-btn" type="submit">検索</button>
					</div>
				</div>
			</form>

views.pyでは、以下のようにrequest.GET.get(‘*’,None)で、getMethodがあるか判定します。
views.py

def client(request, num=1):
	if(request.GET.get('name',None)):
		name= request.GET['name']
		data = Clients.objects.filter(name__contains=name)
		page = Paginator(data, 3)
		params = {
			'data' : page.get_page(num),
			'query' : "会社名に「" + name + "」を含む検索結果"
		}
	else:
		data = Clients.objects.all()
		page = Paginator(data, 3)
		params = {
			'data' : page.get_page(num)
		}
	return render(request, 'sales/client.html', params)

ページネーション
リンク先に、{% if request.GET.name %}?name={{ request.GET.name }}{% endif %}を追加してあげます。

<ul class="pagination justify-content-end">
					{% if data.has_previous %}
					<li class="page-item">
						<a class="page-link" href="/client/1{% if request.GET.name %}?name={{ request.GET.name }}{% endif %}">&laquo; first</a>
					</li>
					<li class="page-item">
						<a class="page-link" href="/client/{{data.previous_page_number}}{% if request.GET.name %}?name={{ request.GET.name }}{% endif %}">&laquo; prev</a>
					</li>
					{% else %}
					<li class="page-item">
						<a class="page-link">&laquo; first</a>
					</li>
					<li class="page-item">
						<a class="page-link">&laquo; prev</a>
					</li>
					{% endif %}
					<li class="page-item">
						<a class="page-link">{{data.number}}/{{data.paginator.num_pages}}</a>
					</li>
					{% if data.has_next %}
					<li class="page-item">
						<a class="page-link" href="/client/{{data.next_page_number}}{% if request.GET.name %}?name={{ request.GET.name }}{% endif %}">next &raquo;</a>
					</li>
					<li class="page-item">
						<a class="page-link" href="/client/{{data.paginator.num_pages}}{% if request.GET.name %}?name={{ request.GET.name }}{% endif %}">last &raquo;</a>
					</li>
					{% else %}
					<li class="page-item">
						<a class="page-link">next &raquo;</a>
					</li>
					<li class="page-item">
						<a class="page-link">last &raquo;</a>
					</li>
					{% endif %}
				</ul>

このように書くことで、ページネーションで遷移する場合でも、検索クエリを引き継ぐことができます。

検索項目が「会社名」だけだが、項目が増えるともう少し複雑になりそう。。
と思ったが、実際に書いてみたら割と簡単だった。

さー、いよいよ次はPythonでPDF。やっとここまで来ました。