Django 기본 CBV API (Generic date views)

2022. 1. 11. 15:01강의 정리/Django Views

반응형

출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!

 

 


 

 

 

  • Generic Date View
    • ArchiveIndexView: 지정 날짜필드 역순으로 정렬된 목록
    • YearArchiveView: 지정 year 년도의 목록 
    • MonthArchiveView: 지정 year/month 월의 목록
    • WeekArchiveView: 지정 year/week 주의 목록
    • DayArchiveView: 지정 year/month/day 일의 목록 
    • TodayArchiveView: 오늘 날짜의 목록
    • DateDetailView: 지정 year / month / day 목록 중에서 특정 pk의 detail
      • DetailView와 비교하여, URL에 날짜(year / month / day)를 쓰고자 할 경우에 유용하다.

 

# 공통 옵션 

allow_future (디폴트 : False) : 미래의 시간을 허용하겠느냐

  • False : 현재 시간 이후의 Record는 제외

 


 

ArchiveIndexView: 지정 날짜필드 역순으로 정렬된 목록

  • 최신순으로 목록을 보고자 할 때
  • 필요한 URL 인자 : 없음
  • 옵션
    • model
    • date_field : 정렬 기준 필드
    • date_list_period (디폴트 : "year")
  • 디폴트 template_name_suffix : "모델명_archive.html"
  • Context
    • latest : QuerySet
    • date_list : 등록된 Record의 년도 목록 ex) Year단위로 글들을 그룹핑해서 list로 제공해줌

 

 


# instagram/views.py

from django.views.generic import  ArchiveIndexView

post_archive = ArchiveIndexView.as_view(model=Post, date_field='created_at')

 

 

# instagram/urls.py

urlpatterns = [ 
    path('post_archive/', views.post_archive, name='post_archive'),
]

 

# instagram/templates/instagram/post_archive.html

  • Context : 템플릿에서 사용할 수 있는 객체
    • latest : QuerySet
    • date_list : 등록된 Record의 년도 목록 ex) Year단위로 글들을 그룹핑해서 list로 제공해줌
<h2>latest</h2>

{{ latest }}

<h2>date_list</h2>

{{ date_list }}

 

 

 


 

# 데이터들의 연도와 월을 랜덤하게 지정해주는 방법

python manage.py shell    

>>> from instagram.models import Post
>>> post_list = Post.objects.all()
>>> import random
>>> for post in post_list:
...     year = random.choice(range(1990, 2020))        
...     month = random.choice(range(1, 13))
...     post.created_at = post.created_at.replace(year=year, month=month)
...     post.save()

 

>>> 랜덤하게 바꾼 결과

>>> Post.objects.all().values_list('created_at__year') 
<QuerySet [(1990,), (2009,), (1998,), (1993,), (2012,), (1991,), (1991,), (2010,), (1997,), (2005,), (2009,), (2015,), (1998,), (2003,), (2000,), (1996,), (1990,), (2004,), (2019,), (1991,), '...(remaining elements truncated)...']>

튜플을 리스트로 평평하게 변환
>>> Post.objects.all().values_list('created_at__year', flat=True)  
<QuerySet [1990, 2009, 1998, 1993, 2012, 1991, 1991, 2010, 1997, 2005, 2009, 2015, 1998, 2003, 2000, 1996, 1990, 2004, 2019, 1991, '...(remaining elements truncated)...']>

직전 결과를 변수에 담아오기
year_list = _

>>> set(year_list)
{1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2018, 2019}

 

 

 

 


 

YearArchiveView: 지정 year 년도의 목록 

  • 필요한 URL 인자 : "year"
  • 옵션
    • model, date_field
    • date_object_list (디폴트 : False) : 거짓일 경우, object_list를 비움
    • date_list_period (디폴트 : "month") : 지정 년도에서 month 단위로 Record가 있는 날짜 리스트
  • 디폴트 template_name_suffix : "모델명_archive_year.html"
  • Context
    • year, previous_year, next_year
    • date_list : 등록된 Record의 월도 목록 ex) Month단위로 글들을 그룹핑해서 list로 제공해줌
    • object_list : 같은 년도를 가진 객체들 

 


# instagram/views.py

from django.views.generic.dates import YearArchiveView

post_archive_year = YearArchiveView.as_view(model= Post, date_field='created_at', make_object_list=True)

 

 

# instagram/urls.py

urlpatterns = [ 
    path('archive/<year:year>/', views.post_archive_year, name='post_archive_year'),
]

 

# instagram/templates/instagram/post_archive_year.html

  • Context : 템플릿에서 사용할 수 있는 객체
    • latest : QuerySet
    • date_list : 등록된 Record의 년도 목록 ex) Year단위로 글들을 그룹핑해서 list로 제공해줌
<h2> year </h2>
{{ year }}

<h2> previous year </h2>
{{ previous_year }}

<h2> next year </h2>
{{ next_year }}

<h2> object list </h2>
{{ object_list }}

 

 


 

MonthArchiveView: 지정 year/month 월의 목록 

  • 필요한 URL 인자 : "year", "month"
  • 옵션
    • model, date_field
    • date_field (디폴트 : "%b") :
      • 숫자 포맷은 "%m"
  • 디폴트 template_name_suffix : "모델명_archive_month.html"
  • Context : 템플릿에서 사용할 수 있는 객체
    • month, previous_month, next_month
    • date_list : 등록된 Record의 날짜 목록 ex) 날짜 단위로 글들을 그룹핑해서 list로 제공해줌
    • object_list :  같은 월을 가진 객체들 

 

# instagram/urls.py

urlpatterns = [ 
    path('archive/<year:year>/<month:month>/', views.post_archive_month, name='post_archive_month'),
]

 

# instagram/templates/instagram/post_archive_month.html

 

 


 

DayArchiveView: 지정 year/month/Day 일의 목록 

  • 필요한 URL 인자 : "year", "month", "day"
  • 옵션
    • model, date_field
    • month_format (디폴트 : "%b") :
      • 숫자 포맷은 "%m"
  • 디폴트 template_name_suffix : "모델명_archive_day.html"
  • Context : 템플릿에서 사용할 수 있는 객체
    • day, previous_day, next_day
    • date_list : 등록된 Record의 날짜 목록 ex) 날짜 단위로 글들을 그룹핑해서 list로 제공해줌
    • object_list :  같은 날짜를 가진 객체들 

 


 

TodayArchiveView

  • 필요한 URL 인자 : 없음
  • DayArchiveView와 유사하게 동작하지만,
    • year/month/day 인자를 받지 않음
    • previous_day, next_day 미제공

 


 

DateDetailView : 지정 year/month/day 목록 중에서 특정 pk의 detail

  • 필요한 URL 인자 : "year", "month", "day", "pk"(or "slug")
반응형