좋아요 기능 구현
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는
remove
와add
를 사용한다
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>