2022/12/05 (출석 시 포인트 획득 기능 만들다가 생긴 오류)

노우석·2022년 12월 5일
0
post-thumbnail

문제점

내가 출석 버튼을 누르는 순간 포인트가 오르는 기능을 만들고 싶었다.

기능을 만들기 위해 모델안에 포인트를 저장 할 point라는 필드와 버튼을 눌렀을 때에 날짜를 담기 위한 click_time이라는

필드를 DatetimeField로 만들어주고 계속 누를때마다 수정하기위해 auto_add_now = True를 걸어주었다.

그리고 view.py에 우선 포인트를 저장하는 로직을 먼저 작성해주었다.

위 처럼 작성해주고 db를 확인하면서 포스트맨으로 요청을 보낼때마다 점수가 오르는게 확인이 되서 잘 되는가 싶었는데

큰 문제점이 있었다. 그건 바로 auto_add_now =True를 하게되면 같은 테이블안에 있는 다른 필드에서 수정 작업이 이루어지는 그 순간에 날짜도 같이 담겨서 변경되는것이다.

이렇게 되면 내가 출석을 하지않고 회원정보를 변경하거나 하게되면 출석 버튼을 눌렀을때 이미 출석했다고 나오는

오류가 생기게 된다. 따라서 이를 해결하기 위해서는 model에서 auto_now_add를 빼고 view.py 안에서 직접 post 시간을 저장하도록 코드해줘야 한다.

해결

해결한 코드를 먼저 보겠다.

코드를 보면 datetime함수가 눈에 보이는데 이 함수를 사용해서 오늘 날짜와 시간을 변수에 저장하고 그걸 다시

click_time 필드 안에 저장하면 된다. 참고로 뒤에 붙은 today().strftime("%Y-%M-%d")는 datetime함수 문법이라고

생각하면 된다. 지금 필요한 날짜 정보는 출석하기 위한 정보이기 때문에 년,월,일이면 충분하다. 따라서 문법을 사용해서

년도 월 일만 담을 수 있게 추출한 것이다.

ex) 2022년12월05일10시7분34초 >>>>>문법사용>>>>> 2022년12월05일

예시 처럼 추출해서 담아주는 것이다. 내가 필요한 정보는 2022-12-05라는 정보이니 안에다가 -를 사이에 넣어주어야 한다.

이렇게 하면 auto_now_add를 사용하지 않고도 view에서 직접 날짜를 넣어줄 수 있다.

하루에 한번 누르게 하기(출석)

이제 포인트가 누를때마다 오르는 건 가능해졌으니 조건문을 추가해서 하루에 한번만 버튼을 누를 수 있게 바꿔주어야 한다.

내가 생각했던 로직은 이미 now라는 변수안에 현재 날짜 정보가 담기고 있으니 클릭했을 때 저장되는 날짜 정보(click_time)과 현재 오늘의 날짜 정보(now변수)를 비교해서 같으면 오류메시지가 나오게 해주면 될 것 같았다.

이렇게 코드를 작성하면 완성이다. user테이블안에 click_time 필드 속 날짜와 now안에 현재 날짜가 같다면 조건문을

지나가지 못하게 해놓았다.

여기서 크게 주의할 점은 반드시 model안에서 click_time필드의 타입을 now라는 변수에 담기는 타입과 같게 설정해주어야 한다.

이 문제로 인해 한참 헤메다가 타입이 다를 경우 형태가 같아도 다른값으로 인식한다는걸 알았다.

print(type(click_time)) , print(type(now)) 를 입력해보고 출력해봐서 타입이 달라서 if문을

무시하고 패스했다는 걸 깨달았다.

이는 model에서 click_time 필드타입을 charField로 바꿔주면서 해결했다.

profile
중요한건 버그에게 꺾이지 않는 마음

0개의 댓글