티스토리 뷰
Django/▶-----Pystagram
[Django App 3-10] 인스타그램 클론 코딩_좋아요 뷰/좋아요 취소 뷰&북마크 뷰/북마크 취소 뷰
Liiot 2020. 3. 8. 02:17<Complete List>
1. 데이터베이스 및 UI 설계하기
- 인스타그램 UI 구성
- 데이터베이스 테이블 설계 및 구현
2. 앱 만들기
- instagram, accounts 앱 만들기
- views.py 분리하기
3. 회원가입 페이지
- 비밀번호 암호화 함수 구현 - 해시 함수
4. 로그인 페이지
- 세션에 사용자 ID 저장하기
5. 로그아웃 뷰
6. 메인 페이지
7. 포스트 리스트 페이지
- 7-1. 팔로우 뷰 / 언팔로우 뷰
8. 포스트 상세 페이지
9. 포스트 업로드 페이지
10. 회원 정보 수정 페이지
11. 비밀번호 수정 페이지
12. 포스트 수정 페이지
13. 포스트 삭제 뷰
<To Do List>
6-1. 메인 페이지
- 좋아요 뷰 / 좋아요 취소 뷰
6-2. 메인 페이지
- 북마크 뷰 / 북마크 취소 뷰
6-1 메인 페이지(좋아요 뷰 / 좋아요 취소 뷰)
- pystagram에서 작업
- 메인 페이지의 좋아요 버튼
6-1.1 url
urlpatterns = [
...
re_path(r'^like/(?P<post_id>[0-9]+)/$', LikePostView, name='pn_like_post'),
re_path(r'^unlike/(?P<post_id>[0-9]+)/$', UnlikePostView, name='pn_unlike_post'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
6-1.2 LikePostView / UnlikePostView
- splitviews 디렉토리에 LikePostView.py / UnlikePostView.py 생성
- splitviews 의
__init.py__
에 LikePostView / UnlikePostView 를 import - 모두 Ajax로 통신
- 좋아요 뷰 로직(전체코드 - github)
- 현재 로그인된 유저가 좋아요를 누른 포스트의 post_id와 현재 유저의 아이디로 like_post에 데이터 INSERT
- 선택된 포스트의 변경된 좋아요 개수를 SELECT
- 좋아요 개수를 return
- 좋아요 취소 뷰 로직(전체코드 - github)
- 현재 로그인된 유저가 좋아요를 누른 포스트의 post_id와 현재 유저의 아이디로 like_post에 데이터 DELETE
- 선택된 포스트의 변경된 좋아요 개수를 SELECT
- 좋아요 개수를 return
6-1.3 main.html
- 전체코드 - github
- javascript 함수 로직(200310 수정)
likePost()
로직- 클릭된 좋아요 버튼이 어떤 포스트에 대한 좋아요 버튼인지 알기 위해 클릭된 element와 클릭된 포스트 ID를 인자로 받는다.
- Ajax로 통신
- 성공적으로 통신했다면 LikePostView 로부터 변경된 좋아요 개수를 받아온다.
- 좋아요 버튼을 채우고, 변경된 좋아요 개수를 반영
unlikePost()
로직- 클릭된 좋아요 버튼이 어떤 포스트에 대한 좋아요 버튼인지 알기 위해 클릭된 element와 클릭된 포스트 ID를 인자로 받는다.
- Ajax로 통신
- UnlikePostView 로부터 변경된 좋아요 개수를 받아온다.
- 좋아요 버튼을 비우고 html 에 변경된 좋아요 개수를 반영
...
<div class="info_left">
{% if post.like == 0 %}
<i class="far fa-heart" onclick="likePost(this, {{ post.post_id }})"></i>
{% else %}
<i class="fas fa-heart" onclick="unlikePost(this, {{ post.post_id }})"></i>
{% endif %}
<i class="far fa-comment"></i>
</div>
...
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
function likePost(elm, n) {
$.ajax({
url: "{% url 'pystagram:pn_like_post' 1 %}".replace('1', n),
data: {'csrfmiddlewaretoken': '{{ csrf_token }}'},
dataType: "json",
type: "POST",
success: function(response) {
$(elm).attr("class", "fas fa-heart");
$(elm).attr("onclick", "unlikePost(this, " + n + ")");
$("#likeCount").text(response.likeCount);
},
error: function(xhr, status) {
alert(status + "!!!");
alert("좋아요를 반영하는 과정에서 에러가 발생했습니다.");
}
});
}
function unlikePost(elm, n) {
$.ajax({
url: "{% url 'pystagram:pn_unlike_post' 1 %}".replace('1', n),
data: {'csrfmiddlewaretoken': '{{ csrf_token }}'},
dataType: "json",
type: "POST",
success: function(response) {
$(elm).attr("class", "far fa-heart");
$(elm).attr("onclick", "likePost(this, " + n + ")");
$("#likeCount").text(response.likeCount);
},
error: function(xhr, status) {
alert(status + "!!!");
alert("좋아요 취소를 반영하는 과정에서 에러가 발생했습니다.");
}
});
}
6-2 메인 페이지(북마크 뷰 / 북마크 취소 뷰)
- pystagram에서 작업
- 메인 페이지의 컬렉션 버튼
6-2.1 url
urlpatterns = [
...
re_path(r'^bookmark/(?P<post_id>[0-9]+)/$', BookmarkView, name='pn_bookmark'),
re_path(r'^unbookmark/(?P<post_id>[0-9]+)/$', UnbookmarkView, name='pn_unbookmark'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
6-2.2 BookmarkView / UnbookmarkView
- splitviews 디렉토리에 BookmarkView.py / UnbookmarkView.py 생성
- splitviews 의
__init.py__
에 BookmarkView / UnbookmarkView 를 import - 모두 Ajax로 통신
- 북마크 뷰 로직(전체코드 - github)
- 현재 로그인된 유저가 컬렉션을 누른 포스트의 post_id와 현재 유저의 아이디로 bookmark에 데이터 INSERT
- 성공 여부를 return
- 북마크 취소 뷰 로직(전체코드 - github)
- 현재 로그인된 유저가 컬렉션을 누른 포스트의 post_id와 현재 유저의 아이디로 bookmark에 데이터 DELETE
- 성공 여부를 return
6-2.3 main.html
- 전체코드 - github
- javascript 함수 로직(200310 수정)
bookmark()
로직- 클릭된 컬렉션 버튼이 어떤 포스트에 대한 컬렉션 버튼인지 알기 위해 클릭된 element와 클릭된 포스트 ID를 인자로 받는다.
- Ajax로 통신
- 성공적으로 통신했다면 컬렉션 버튼을 채움
unbookmark()
로직- 클릭된 컬렉션 버튼이 어떤 포스트에 대한 컬렉션 버튼인지 알기 위해 클릭된 element와 클릭된 포스트 ID를 인자로 받는다.
- Ajax로 통신
- 성공적으로 통신했다면 컬렉션 버튼을 비움
...
<div class="info_right">
{% if post.bookmark == 0 %}
<i class="far fa-bookmark" onclick="bookmark(this, {{ post.post_id }})"></i>
{% else %}
<i class="fas fa-bookmark" onclick="unbookmark(this, {{ post.post_id }})"></i>
{% endif %}
</div>
...
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
function bookmark(elm, n) {
$.ajax({
url: "{% url 'pystagram:pn_bookmark' 1 %}".replace('1', n),
data: {'csrfmiddlewaretoken': '{{ csrf_token }}'},
dataType: "json",
type: "POST",
success: function(response) {
$(elm).attr("class", "fas fa-bookmark");
$(elm).attr("onclick", "unbookmark(this, " + n + ")");
},
error: function(xhr, status) {
alert(status + "!!!");
alert("컬렉션을 저장하는 과정에서 에러가 발생했습니다.");
}
});
}
function unbookmark(elm, n) {
$.ajax({
url: "{% url 'pystagram:pn_unbookmark' 1 %}".replace('1', n),
data: {'csrfmiddlewaretoken': '{{ csrf_token }}'},
dataType: "json",
type: "POST",
success: function(response) {
$(elm).attr("class", "far fa-bookmark");
$(elm).attr("onclick", "bookmark(this, " + n + ")");
},
error: function(xhr, status) {
alert(status + "!!!");
alert("컬렉션을 삭제하는 과정에서 에러가 발생했습니다.");
}
});
}
포스트 상세 페이지에도 좋아요 버튼과 컬렉션 버튼이 있으므로 위와 똑같이 반영한다.
'Django > ▶-----Pystagram' 카테고리의 다른 글
[Django App 3-12] 인스타그램 클론 코딩_해시태그 (0) | 2020.03.25 |
---|---|
[Django App 3-11] 인스타그램 클론 코딩_팔로잉 계정 리스트 모달&컬렉션 탭 (0) | 2020.03.15 |
[Django App 3-9] 인스타그램 클론 코딩_포스트 수정 페이지&포스트 삭제 뷰 (0) | 2020.03.03 |
[Django App 3-8] 인스타그램 클론 코딩_비밀번호 수정 페이지&팔로우 뷰/언팔로우 뷰 (0) | 2020.03.03 |
[Django App 3-7] 인스타그램 클론 코딩_포스트 업로드 페이지&회원 정보 수정 페이지 (0) | 2020.02.27 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Django 회원 정보 수정
- Django 해시태그
- Django 댓글
- 북마크 어플리케이션
- Django Instagram
- java
- Django 프로젝트 생성
- Django 좋아요
- Django 북마크
- 서점 어플리케이션
- Django 검색
- 장고
- Django 비밀번호 수정
- Redis
- Django 컬렉션
- 파이썬
- MySQL
- query parameter
- Django application
- Django 어플리케이션
- Redis Cache
- Django User
- Django
- python
- Django 로그아웃
- Django 회원가입
- Django 인스타그램
- Django 팔로우
- Django 로그인
- Django 업로드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함