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를 받아온다.
'장고' 카테고리의 다른 글
개발일지 16 - 베스트 댓글 만들기 (0) | 2024.08.30 |
---|---|
개발 일지 15 - 게시글 좋아요 순으로 정렬 + 페이지 바뀔 때 정렬 유지 (0) | 2024.08.29 |
개발 일지 13 - 댓글 좋아요 기능 (0) | 2024.08.27 |
개발 일지 12 - 게시판 좋아요 기능 (0) | 2024.08.26 |
개발 일지 11 - 댓글 수정, 삭제 기능 추가 (0) | 2024.08.25 |