Django 정렬 기능 구현

찬민·2024년 8월 23일

TIL

목록 보기
42/62

Django에서 데이터 정렬 기능 구현하기

Django를 사용하여 웹 애플리케이션을 개발할 때, 사용자가 원하는 기준으로 데이터를 정렬하는 기능은 매우 중요하다. 이번 블로그에서는 Django에서 날짜, 좋아요 수, 댓글 수에 따라 데이터를 정렬하는 방법을 설명한다.

URL 설정 (url.py)

정렬을 위한 URL 설정:
정렬 기능을 구현하려면 먼저 URL 설정을 통해 정렬 기준에 따라 데이터를 요청할 수 있도록 해야 한다. 아래 코드는 products 앱의 URL 패턴을 정의한 것이다.

from django.urls import path
from products import views

app_name = 'products'
urlpatterns = [
    path('create/', views.create, name='create'),
    path('<int:pk>/', views.details, name='details'),
    path('<int:pk>/delete/', views.delete, name='delete'),
    path('<int:pk>/update/', views.update, name='update'),
    path('<int:pk>/comments/', views.comments, name='comments'),
    path('<int:pk>/comments_delete/', views.comments_delete, name='comments_delete'),
    path('<int:pk>/like/', views.like, name='like'),
]

HTML 템플릿에서 정렬 옵션 제공 (index.html)

사용자에게 정렬 옵션 제공:
사용자가 원하는 정렬 기준을 선택할 수 있도록 HTML 템플릿에 링크를 추가한다. 이 링크를 통해 사용자는 날짜, 좋아요, 댓글 수 중에서 선택하여 데이터를 정렬할 수 있다.

<p>
    <a href="?sort=date">날짜순 | </a> 
    <a href="?sort=likes">인기순 | </a>
    <a href="?sort=comments">댓글순</a>
</p>

View 함수에서 정렬 기능 구현 (views.py)

정렬 기능 구현:
views.py에서 사용자가 선택한 정렬 기준에 따라 데이터를 정렬하여 반환하는 기능을 구현한다. 아래의 코드는 sort GET 파라미터를 사용하여 데이터를 정렬하는 방법을 보여준다.

from django.db.models import Count

def index(request):
    sort = request.GET.get('sort', 'date')  # 기본값은 날짜순으로 설정
    if sort == 'likes':
        products = Product.objects.annotate(like_count=Count('like_users')).order_by('-like_count', '-created_at')  # 좋아요 순으로 정렬
    elif sort == 'comments':
        products = Product.objects.annotate(comment_count=Count('comments')).order_by('-comment_count', '-created_at')  # 댓글 순으로 정렬
    else:  
        products = Product.objects.all().order_by('-created_at')  # 날짜 순으로 정렬

    context = {
        'products': products,
    }
    return render(request, 'products/index.html', context)

정렬 기준에 따른 데이터 반환:
위의 코드에서 sort 파라미터를 통해 정렬 기준을 결정한 후, annotateorder_by 메서드를 사용하여 데이터를 정렬한다. 정렬된 데이터는 products 리스트에 저장되며, 이를 템플릿에 전달하여 화면에 표시된다.

0개의 댓글