Django/DRF

[Django] Generic date views (Archive views)

Jong_seoung 2024. 6. 18. 10:53
반응형

Generic date views 란?

Django의 클래스 기반 뷰는 다양한 유형의 뷰를 최소한의 코드로 처리할 수 있도록 도와주는데, 그 중에서 Generic date views는 날짜 기반 데이터를 효율적으로 관리하고 표시하는데 많은 도움을 준다.

 

블로그, 뉴스, 웹사이트에서 날짜별로 콘텐츠를 정리하는데 유용하며 아래와 같은 기능들이 있다.

  • ArchiveIndexView: 날짜 필드를 기준으로 정렬된 객체 목록을 표시
  • YearArchiveView: 특정 연도의 객체를 표시
  • MonthArchiveView: 특정 연도의 특정 월에 해당하는 객체를 표시
  • WeekArchiveView: 특정 연도의 특정 월의 특정일에 해당하는 객체를 표시
  • DayArchiveView: 특정 연도의 특정 월의 특정일에 해당하는 객체를 표시
  • TodayArchiveView: 현재 날짜의 객체를 표시
  • DateDetailView: 연도, 월, 일, 고유 식별자를 기준으로 단일 객체를 표시

 

공통 옵션

  • allow_future (디폴트 : False)
    • False : 조회 조건에서 지정 필드의 현재 날짜 이후 레코드에서 제외
  • allow_empty (디폴트 : False)
    • False : 빈 리스트에서는 404 응답
  • paginate_by (디폴트: None)
    • 페이징 크기

 

사용 예시

from django.views.generic.dates import (사용할 view)

 

ArchiveIndexView

# views.py
from django.views.generic.dates import ArchiveIndexView
from .models import Song

class SongArchiveIndexView(ArchiveIndexView):
    model = Song
    date_field = "release_date"
    paginate_by = 10  # 더 나은 사용성을 위한 페이지네이션
    
    
# urls.py
urlpatterns = [
    path('archives/', SongArchiveIndexView.as_view(), name='song_archive_index'),
]

 

YearArchiveView

# views.py
from django.views.generic.dates import YearArchiveView

class SongYearArchiveView(YearArchiveView):
    model = Song
    date_field = "release_date"
    make_object_list = True  # 컨텍스트에 객체 목록 포함


# urls.py
urlpatterns += [
    path('archives/<int:year>/', SongYearArchiveView.as_view(), name='song_archive_year'),
]

 

MonthArchiveView

# views.py
from django.views.generic.dates import MonthArchiveView

class SongMonthArchiveView(MonthArchiveView):
    model = Song
    date_field = "release_date"


# urls.py
urlpatterns += [
    path('archives/<int:year>/<int:month>/', SongMonthArchiveView.as_view(), name='song_archive_month'),
]

 

WeekArchiveView

# views.py
from django.views.generic.dates import WeekArchiveView

class SongWeekArchiveView(WeekArchiveView):
    model = Song
    date_field = "release_date"
    week_format = "%U"  # 주 형식 지정 (예: "%U"는 0부터 시작하는 주 번호)


# urls.py
urlpatterns += [
    path('archives/<int:year>/week/<int:week>/', SongWeekArchiveView.as_view(), name='song_archive_week'),
]

 

DayArchiveView

# views.py
from django.views.generic.dates import DayArchiveView

class SongDayArchiveView(DayArchiveView):
    model = Song
    date_field = "release_date"


# urls.py
urlpatterns += [
    path('archives/<int:year>/<int:month>/<int:day>/', SongDayArchiveView.as_view(), name='song_archive_day'),
]

 

TodayArchiveView

# views.py
from django.views.generic.dates import TodayArchiveView

class SongTodayArchiveView(TodayArchiveView):
    model = Song
    date_field = "release_date"


# urls.py
urlpatterns += [
    path('archives/today/', SongTodayArchiveView.as_view(), name='song_archive_today'),
]

 

DateDetailView

# views.py
from django.views.generic.dates import DateDetailView

class SongDateDetailView(DateDetailView):
    model = Song
    date_field = "release_date"
    slug_field = "slug"  # 고유 식별자 필드
    slug_url_kwarg = "slug"  # URL에서 식별자를 추출하는 키워드 인자


# urls.py
urlpatterns += [
    path('archives/<int:year>/<int:month>/<int:day>/<slug:slug>/', SongDateDetailView.as_view(), name='song_detail'),
]
반응형