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

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">« first</a>
</li>
<li class="page-item">
<a class="page-link" href="/client/{{data.previous_page_number}}">« 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 %}">« 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 %}">« prev</a>
</li>
{% else %}
<li class="page-item">
<a class="page-link">« first</a>
</li>
<li class="page-item">
<a class="page-link">« 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 »</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 »</a>
</li>
{% else %}
<li class="page-item">
<a class="page-link">next »</a>
</li>
<li class="page-item">
<a class="page-link">last »</a>
</li>
{% endif %}
</ul>
このように書くことで、ページネーションで遷移する場合でも、検索クエリを引き継ぐことができます。

検索項目が「会社名」だけだが、項目が増えるともう少し複雑になりそう。。
と思ったが、実際に書いてみたら割と簡単だった。
さー、いよいよ次はPythonでPDF。やっとここまで来ました。