페이징을 이용해 게시판을 개발하면 자주 발생하는 문제 중 하나는, 다음 페이지로 넘어갈 때에도 검색에 사용한 쿼리 파라미터가 유지되어야한다는 점입니다.
페이지 링크를 단순히 페이지 넘버만을 이용해서 생성하면, 다른 페이지 번호로 넘어가는 순간, 검색 쿼리를 잃어버리고 맙니다.
Spring 에서 작업할 때는 보통 PagingSearch VO에서 작업합니다. 그 뒤, 쿼리파라미터를 VO에서 보관하고 있다가, 페이지를 그릴 때 입력해서 넣으면 됩니다.
"""
views.py
컨텍스트로 파라미터를 딕셔너리로 넘겨준다.
"""
context = {
'list': page_obj
, 'query_dict': request.GET
}
"""
filter.py
템플렛 태그에서 딕셔너리를 쿼리스트링으로 변경하는 함수를 만들어 등록해준다.
"""
@register.filter
def get_query_string(query_dict: dict):
query_string = ""
for key in list(query_dict.keys()):
if key == "page":
continue # 페이지는 제외.
query_string += f"&{key}={query_dict[key]}"
return query_string
<!--
등록한 템플릿 태그로 쿼리스트링을 붙이고
페이지 넘버는 컨텍스트에서 불러와서 뿌린다.
-->
<ul>
{% for page in list.elided_page_range %}
{% if page == list.paginator.ELLIPSIS %}
<li class="disabled">...</li>
{% else %}
{% if page == list.number %}
<li class="active">{{ page }}</li> <!-- 현재 페이지 -->
{% else %}
<li>
<a href="?page={{ page }}{{ query_dict|get_query_string }}">{{ page }}</a>
</li>
{% endif %}
{% endif %}
{% endfor %}
</ul>
더 나은 방법이 있을 거 같은데 지금은 이 정도로 마무리했습니다.