장고

개발 일지 14 - 게시글 조회수로 정렬

sorecord 2024. 8. 28. 10:25

get 과 post의 차이를 알아야 한다.

 

GET 요청 : 주로 데이터를 요청하고 조회할 때 사용된다. URL에 쿼리 파라미터를 포함해 서버에 요청을 보내고, 서버는 이에 맞는 데이터를 반환한다. 예> 정렬, 검색, 필터링 등의 작업은 주로 GET 요청으로 처리된다.

 

POST 요청: 주로 서버에 데이터를 제출하거나 변경할 때 사용된다. 예> 폼 데이터를 서버에 제출하여 새로운 데이터를 생성하거나 기존 데이터를 수정할 때 사용됩니다.

 

처음에 post를 사용하려다가 챗 GPT와 구글링을 해본 결과 GET을 사용하는게 더 적합하다는 것을 알았다. 

 

<div>
                <form method="get" action="{% url 'post_sort' %}" style="display:inline;">
                    
                    <input type="hidden" name="sort" value="views_desc">
                    <button type="submit" {% if request.GET.sort == 'views_desc' %}class="active"{% endif %}>
                        조회수 높은 순
                    </button>
                </form>
            
                <form method="get" action="{% url 'post_sort' %}" style="display:inline;">
                    {% comment %} {% csrf_token %} {% endcomment %}
                    <input type="hidden" name="sort" value="views_asc">
                    <button type="submit" {% if request.GET.sort == 'views_asc' %}class="active"{% endif %}>
                        조회수 낮은 순
                    </button>
                </form>
</div>

 

위와 같이 코드를 구현했다. 처음에 CSRF토큰을 사용했다가 get 요청시에 필요없다고 해서 지웠다. 

 

여기서 조회수 높은 순을 클릭했을 때 /book/?sort=views_desc라는 경로로 바뀌는 것을 확인할 수 있었고 이렇게 값을 아래 view.py 함수로 보낸다. 

 

def post_sort(request):
    print("sort")
    sort_option = request.GET.get('sort')
    
    # 기본 정렬: 최신순
    if sort_option == 'views_desc':
        print('-view')
        posts = Post_information.objects.all().order_by('-views')
    elif sort_option == 'views_asc':
        print("view")
        posts = Post_information.objects.all().order_by('views')
    else:
        posts = Post_information.objects.all().order_by('-created_at')
    
    # 페이지네이션 추가
    paginator = Paginator(posts, 10)  # 페이지 당 10개의 게시글
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    context = {
        'page_obj': page_obj,
    }
    print(context)
    return render(request, 'book/index.html', context)

 

view_desc가 들어올때 가장 조회수가 높은 순대로 정렬한 값을 paginator함수에 넣어서 페이지를 나눈 다음 index 파일로 넘어가서 정렬을 한다.

 

위 코드에서 sort_option은 /book/?sort=views_desc 이 url에서 sort 뒤에 있는 views_desc를 받아온다.