티스토리 뷰
[django 블로그] Post 게시물 좋아요 버튼 로직 ( views.py, @required_POST, post_like, like_section)
지휘리릭 2020. 2. 2. 18:58● 게시물 좋아요 버튼
post/views.py
- 좋아요 버튼에 대한 로직.
- 로그인한 사용자인 경우와 POST method인 경우에만 post_like 로직에 접근할 수 있다.
- POST 요청된 페이지의 post_id 를 갖는 게시물 페이지를 확인하고 게시물 객체를 post에 저장
- 현재 게시글의 좋아요 필드에 사용자의 id 가 존재하는지 확인하여 Boolean 값으로 저장한다.
- reverse 는 주소를 만들어준다. post_detail 에 post_id 를 추가해 'post_detail/post_id/' 경로를 만들어 현재 게시물로 이동하도록 한다.
@login_required
@require_POST
def post_like(request):
post = get_object_or_404(Post, id=request.POST.get('post_id'))
is_liked = post.likes.filter(id = request.user.id).exists()
if is_liked :
post.likes.remove(request.user)
else:
post.likes.add(request.user)
return HttpResponseRedirect(reverse('post_detail', kwargs = {'post_id':post.id}))
- if else 구문과 왜 if 문에서는 remove를 하고 else 문에서는 add를 할까? 좋아요를 눌렀으면 (is_liked == True) add 가 진행되는 것 아닌지.. 정말 너무 헷갈렸다.
그래서 모든 정보를 출력하면서 값이 어떻게 변하는지 확인했다.
def post_like(request):
post = get_object_or_404(Post, id=request.POST.get('post_id'))
is_liked = post.likes.filter(id = request.user.id).exists()
print("현재 사용자 : ", request.user)
print("게시물 정보 : ", post)
print("post.likes.filter(Before) :", post.likes.filter(id = request.user.id))
print("is_liked :",is_liked)
if is_liked :
print("좋아요 취소했습니다.")
post.likes.remove(request.user)
print("post.likes.filter(After) : ", post.likes.filter(id = request.user.id))
else:
print("좋아요를 눌렀습니다.")
post.likes.add(request.user)
print("post.likes.filter(After) : ", post.likes.filter(id = request.user.id))
return HttpResponseRedirect(reverse('post_detail', kwargs = {'post_id':post.id}))
(1) "좋아요" 누른 경우
[02/Feb/2020 18:37:42] "GET /blogs/post_detail/1 HTTP/1.1" 200 6818
현재 사용자 : <1 admin@gmail.com>
게시물 정보 : 1 - 스타벅스
post.likes.filter(Before) : <QuerySet []>
# 사용자가 아직 좋아요를 안눌렀기 때문에 QuerySet 값이 비어있다.
is_liked : False
# 현재 사용자가 좋아요가 안눌린 상태 False 값 가지므로 else문 진입
좋아요를 눌렀습니다.
post.likes.filter(After) : < QuerySet [<User : <1 admin@gmail.com>>] >
# 좋아요 버튼 눌렀기 때문에 QuerySet에 현재 사용자 정보가 추가됨
[02/Feb/2020 18:37:45] "POST /blogs/post_like/ HTTP/1.1" 302 0
(2) "좋아요 취소" 누른 경우
[02/Feb/2020 18:37:45] "GET /blogs/post_detail/1 HTTP/1.1" 200 6825
현재 사용자 : <1 admin@gmail.com>
게시물 정보 : 1 - 스타벅스
post.likes.filter(Before) : < QuerySet [<User : <1 admin@gmail.com>>] >
# 위에서 좋아요를 눌러놨기 때문에 QuerySet에 현재 사용자가 저장됨
is_liked : True
# 현재 사용자가 좋아요를 누른 상태 True 값 갖는다. if문 진입
좋아요 취소했습니다.
post.likes.filter(After) : <QuerySet []>
# 좋아요 취소 버튼을 눌렀기 때문에 QuerySet에서 현재 사용자 삭제
[02/Feb/2020 18:37:48] "POST /blogs/post_like/ HTTP/1.1" 302 0
templates/post_detail.html
- 게시글 출력 코드와 소셜공유 코드 사이에 추가한다.
- 좋아요 버튼이 눌리면 'post_like' 의 경로로 전달된다.
{% extends 'base_.html' %}
{% load social_share %}
{% block content %}
<div class = "container">
<div class = "row">
<!--게시글 상세보기-->
</div>
<div id = '#like_section'>
{{total_likes}}
{% if user.is_authenticated %}
<form action = "{% url 'post_like'%}" method = "POST">
{% csrf_token %}
{% if is_liked %}
<button type = "submit" class = "btn btn-primary" id = "like" name = "post_id" value = "{{post.id}}">좋아요 취소</button>
{% else %}
<button type = "submit" class = "btn btn-primary" id = "like" name = "post_id" value = "{{post.id}}">좋아요</button>
{% endif %}
</form>
{% endif %}
</div>
<div class = "row">
<!--소셜 공유-->
</div>
</div>
{% endblock %}
실행결과
- 좋아요를 누르면 좋아요 총 갯수가 증가하면서 좋아요 취소 버튼으로 바뀐다. 반대의 상황에서도 총 갯수가 감소하면서 좋아요 버튼으로 바뀌는 것을 알 수 있다.
- 그러나 버튼을 누를 때마다 새로고침 된다.
- ajax, jQuery 를 사용한 좋아요 로직으로 변경하면 데이터 처리가 쉽게 되면서 새로고침 이라는 단점을 보완할 수 있다. 아래의 블로그가 굉장히 잘 나와있다.
- 저도 계속 도전중이나 자꾸 오류가 나는 관계로.. ㅠ 추후에 추가해보겠습니다.
https://wayhome25.github.io/django/2017/06/25/django-ajax-like-button/
Django - Ajax / jQuery를 활용하여 새로고침 없이 좋아요 기능 구현하기 · 초보몽키의 개발공부로그
Django - Ajax / jQuery를 활용하여 새로고침 없이 좋아요 기능 구현하기 25 Jun 2017 | python Django ajax 개인적인 연습 내용을 정리한 글입니다. 더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :) 목차 들어가기 요즘 연습중인 인스타그램st 프로젝트 를 진행하며 좋아요 버튼을 눌렀을 때 새로고침 없이 좋아요 숫자가 증감하도록 구현하고 싶었다. 내가 원하는 것 (좋아요 숫자가 바로 변경된다) 찾아
wayhome25.github.io
'django project > 블로그' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 까만 화면
- 테이블출력안됨
- pythonanywhere배포
- ModelForm Form 차이
- python 웹 배포
- django clean
- iOS 화면 안나옴
- 웹 배포
- 알파벳 카운팅
- iOS 데이터베이스
- iOS UITableView 출력안됨
- cleaned_data
- django pythoneverywhere
- CellForRowAt Not Called
- CellForRowAt 호출안됨
- django 게시판
- pythonanywhere배포방법
- Django
- UITableViewController Not Working
- django 개발일지
- Realtime Database
- django 로그인접근
- 데이터베이스 추천
- django tag
- django 태그
- iOS 검은 화면
- 장고 태그달기
- 실시간 데이터베이스
- 장고 게시판
- Firebase 데이터베이스 추천
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |