필자는 미디움을 참고하여 결과물을 만들고 있다. 장고를 이제 좀 알겠다 싶었으나 제자리 걸음을 하고 있는 듯한 느낌이다. 이게 장고에 익숙하지 않아서 그런건지 데이터 베이스를 아직도 잘 모르는 건지 판단이 안된다. 여튼 좋아요 버튼을 만들어 보았다.


MODEL

“좋아요는 댓글처럼 모델을 따로 만들어야 하나?”라는 고민을 했었지만 ManyToManyField를 사용하면 한 사용자가 한 포스트에 좋아요를 하거나 취소하도록 할 수 있다.

1
2
3
class Post(models.Model):
    ...
    likes = models.ManyToManyField(User, related_name='likes')

그래서 좋아요는 포스트의 하나의 테이블로 들어간다.


URL

필자는 좋아요 버튼을 누르면 URL로 접속해서 포스트와 상호작용을 시킬 것이다.

1
2
3
urlpatterns = [
    ...
    path('posts/<int:pk>/like', views.post_like, name='post_like'),

간단하게 포스트의 주요키만 받으면 할 수 있겠다 싶어서 위와같은 URL을 만들었다.


VIEW

좋아요 버튼은 SUBMIT되는 것이 아니므로 POST인지 아닌지 판단할 필요가 없다. (이걸로 삽질 오래함)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def post_like(request, pk):
    # 포스트 정보 받아옴
    post = get_object_or_404(Post, pk=pk)

    # 사용자가 로그인 된건지 확인
    if not request.user.is_active:
        return redirect('post_detail', username=post.author, url=post.url)    

    # 사용자 정보 받아옴
    user = User.objects.get(username=request.user)
    # 좋아요에 사용자가 존재하면
    if post.likes.filter(id = user.id).exists():
        # 사용자를 지움
        post.likes.remove(user)
    else:
        # 아니면 사용자를 추가
        post.likes.add(user)
    # 포스트로 리디렉션
    return redirect('post_detail', username=post.author, url=post.url)


TEMPLATE

1
<a href="{% url 'post_like' pk=post.pk%}">좋아요! {{ post.total_likes }}</a>

이제 템플릿에서 포스트 내부에 위와같은 링크를 만들어주면 링크를 눌렀을때 좋아요를 시켜줄 수 있다!

완성된 기능

WRITTEN BY

배진오

하고싶은 건 다 하면서 사는게 목표
im@baejino.com

comments powered by Disqus