팔로우 기능을 구현해 보고 있다.
이전에 대충 했었는데 그새 다 까먹었다 보다.
팔로우가 이미 되어 있다면 팔로우 취소를 반대로 안되어 있다면 팔로우를 하는 모델을 만드는데.
def follow(request, user_id):
if request.method=='POST':
user = request.user #나
follow_user = User.objects.get(id = user_id) #내가 follow하고 싶은 사람
#이미 팔로우 했는지 확인
follow_exist = Follow.objects.get(user_id=user, follow_id=follow_user).exists()
if follow_exist:
print('팔로우 되어 있다.')
follow_exist.delete()
return redirect('/')
else:
print('팔로우 해야한다.')
Follow.objects.create(
user = user, #나
follow = follow_user #내가 follow한 사람
)
context={
'followers' : follow_exist
}
return render(request, 'user/find_user.html',context)
else:
return render(request, 'user/find_user.html')
이 부분에서 Follow matching query does not exist. 에러가 생긴다.
follow_exist = Follow.objects.get(user_id=user, follow_id=follow_user).exists()하세요
exist()를 사용하면 쿼리가 없을때 그냥 none값이 아닌가? 검색을 해봐도 데이터의 존재만 유무만을 판단한다는데 왜 매칭이 안되는지 모르겠다.
결국 try , except 문으로 가야하는가?
if request.method == 'POST':
# user = request.user
user = User.objects.get(id = request.user.id)
follow_user = User.objects.get(id = user_id)
print(user, follow_user)
try:
follower = Follow.objects.get(user = user, follow = follow_user)
follower.delete()
except Follow.DoesNotExist: #Follow전체를 사용해도 되는가?
Follow.objects.create(
user = user,
follow =follow_user
)
return render(request, 'user/find_user.html')
일단 이렇게 try except로 바꾸니까 되기는 한다..
그런데 except에서 저렇게 Follow.DoesNotExist를 해야하는지 모르겠다. Follow인스턴스.DoesNotExist를 사용하는게 아니라 모델.DoesNotExist를 하는게 되는게 신기하다..
내일 물어봐야지.
저런 궁금증 말고도 아직 여러가지 문제가 있다.
redirect를 사용하지 않고 render를 사용해서 친구 찾기 목록 페이지로 돌아가고 싶은데 그러면 url에 follow/<int:user_id>로 지정한 follow url이 남아서 제대로 페이지로 가지 못한다. 그렇다고 redirect를 사용하면 context값을 전달해주지 못한다.
이것도 계속되는 고질적 문제중에 하나...
과연 어떻게 해야하는가.. 이것도 내일 여쭤봐야겠다.