3. DB에 중복저장되지 않게 변경
get_or_create()
에 전달 된 키워드 인수는get()
호출에 사용한다.- 이 때, 선택인자 default를 제외하고 호출한다.
- 객체가 발견되면, get_or_create()는 해당 객체의 튜플을 반환하고 False를 반환한다.
- 객체가 발견되지 않으면, get_or_create()는 새 객체를 인스턴스화하고 저장하여 새 객체의 튜플과 True를 반환한다.
defaults = {
'title': title,
'description': description,
'published_date': published_date
}
# youtube_id로 검색해 없으면,
# defaults를 포함해 데이터베이스에 저장
Video.objects.get_or_create(
youtube_id=youtube_id,
defaults=defaults
)
4. AbstractUser를 상속받아 CutomUser 구현
- member app 생성
- AbstracUser를 상속받아 MyUser 생성
- AUTH_USER_MODE에 등록
- 마이그레이션 해본다
5. search view의 동작 변경
- keyword로 전달받은 검색어를 이용한 결과를 데이터베이스에 저장하는 부분삭제
- 결과를 적절히 가공하거나 그대로 템플릿으로 전달
- 템플릿에서는 해댱 결과를 데이터베이스를 거치지 않고 바로 출력
6. POST 요청받는 것을 GET 요청받아 처리하도록 변경
.get()
: 딕셔너리 메서드dict.get(key, default=None)
주어진 key의 value를 리턴- 만약 key가 유효하지 않다면, default 값으로 None을 리턴
# Null과 공백여러개가 입려되었을 경우를 처리하기 위해, get 메서드를 사용한다.
keyword = request.GET.get('keyword', '').strip()
if keyword != '':
7. 이전, 다음 페이지 기능
- Youtube serach API에 요청을 보낸 후, 결과에
- nextpageToekn만 올 경우에는 첫 번째 페이지
- 둘다 올 경우에는 중간 어딘가
- prevpageToeken만 올 경우 마지막 페이지
- 템플릿에 nextPageToken, prevPageToken을 전달해서 해당 toekn(next 또는 prev)값이 있을 경우에 따라 각각 ‘다음’ 또는 ‘이전’ 버튼을 만들어준다. (pageToken은 1,2,3페이지로 표현은 안되고 이전/뒤로만 가능)
8. CSS Refresh
캐시때문에 CSS 파일 적용이 잘 안되는데, 이럴 때 파일 이름 뒤에 ?ver1
과 같이 붙여주면된다. 하지만 매번 숫자를 변경하기 번거로으므로 시간의 초를 가져오면 된다.
과제
- 북마크 기능을 만든다.
- 검색결과의 각 아이템에 ‘북마크하기’버튼을 만들어서 누르면 DB에 저장
- 북마크 목록 보기 페이지를 만든다
- 북마크한 영상 목록을 볼 수 있는 페이지 구현
- 중간자 모델을 사용해서 북마크를 추가한 시간 (created_date)을 기록한다.
(extra)
- 사용자 별로 북마크를 구분할 수 있도록한다.
- 검색 결과에서 이미 북마크를 누른 영상은 ‘북마크 되어있음’ 또는 ‘해제’ 버튼이 나타나도록 한다.
- 북마크 목록에서 해당 아이템을 클릭 할 경우 유투브 페이지로 이동하지 않고, 자체 video_detail 페이지를 구현해서 보여주도록 한다.
- CSS 반응형 모바일 만들어보기
- 로그인/회원가입 만들기