FakeInsta

fake-insta5

Posted by 동식이 블로그 on April 12, 2019

좋아요 기능 구현

190412

fake-insta5

  • 좋아요 기능 구현

    • m:n 관계로

    • 먼저 클래스를 하나 더 추가하는 방식으로 진행
1
2
3
4
# posts-models.py
class Like(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
  • migrate진행

  • 좋아요 기능을 위한 링크

1
2
3
# posts-urls.py
## url에 create를 안 붙이는 이유 : 버튼 경로는 하나지만, on/off버튼처럼 만들거니까
path('<int:id>/like/', views.likst, name="like"),
  • 사용자가 좋아요를 안눌렀다면 좋아요를 추가, 이미 눌렀다면 좋아요 취소
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# posts-views.py
from .models import Like

@login_required    
def like(request, id):
    user = request.user
    post = Post.objects.get(id=id)
    likes = post.like_set.all()
    
    check = 0
    for like in likes:
        if user == like.user:
            check = 1
            like_post = like
    
    if check == 1:
        # 사용자가 눌렀을 때
        like_post.delete()
    else:
        # 사용자가 안눌렀을 때
        like = Like(user=user, post=post)
        like.save()
    
    return redirect('posts:list')
  • 버튼달기
1
2
# _post.html
<a href="{% url 'posts:like' post.id %}">좋아요</a>
  • ManyToManyFIeld를 이용한 m:n관계
1
2
3
4
5
6
7
# posts-models.py

class Post(models.Model):
    content = models.CharField(max_length=100)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    ## m2m 추가
    likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='like_post_set', blank=True)
  • ManyToManyField는 removeadd를 사용한다
1
2
3
4
5
6
7
8
9
10
11
12
13
# posts-views.py
@login_required    
def like(request, id):
    user = request.user
    post = Post.objects.get(id=id)
    
    # 사용자가 좋아요를 눌렀다면
    if user in post.likes.all():
        post.likes.remove(user)
    # 사용자가 좋아요를 누르지 않았다면
    else:
        post.likes.add(user)
    return redirect('posts:list')
  • 버튼달기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# _post.html
 <div class="card-body">
    <!--좋아요 버튼-->
    {% if user in post.likes.all %}
      <a href="{% url 'posts:like' post.id %}">취소</a>
    {% else %}
      <a href="{% url 'posts:like' post.id %}">좋아요</a>
    {% endif %}
    <!--//좋아요 버튼-->
    <p class="card-text"></p>
    {% if post.user == user %}
    <a href="{% url 'posts:update' post.id %}" class="btn btn-warning">수정</a>
    <a href="{% url 'posts:delete' post.id %}" class="btn btn-danger">삭제</a>
    {% endif %}
  </div>
  • 좋아요 버튼 꾸미기
1
2
3
4
5
{% if user in post.likes.all %}
<a href="{% url 'posts:like' post.id %}"><i class="fas fa-heart" style="color:#ed4956"></i></a>
{% else %}
<a href="{% url 'posts:like' post.id %}"><i class="far fa-heart" style="color:black"></i></a>
{% endif %}
  • 좋아요 개수
1
<p class="card-text">좋아요 개</p>