홍카나의 공부방

[Django] 즐겨찾기(좋아요) 기능 구현하기 본문

Web/Django

[Django] 즐겨찾기(좋아요) 기능 구현하기

홍문관카페나무 2023. 1. 19. 12:08

예시 HTML 템플릿은 아래와 같다.

<form action="{% url 'posts:list' %}" method="POST">
  {% csrf_token %}
    <input type="hidden" name="favorite_pk" value="{{ idea.pk }}" />
        <button type="submit" name="action" value="favorite" class="fav-icon {% if idea.is_favorited %}selected{% else %}unselected{% endif %}">
        {% if idea.is_favorited %}
        <img src="{% static '{이미지 파일 경로}' %}" alt="favorites" />
        {% else %}
        <img src="{% static '{이미지 파일 경로}' %}" alt="favorites" />
        {% endif %}
     </button>
</form>

 

코드 이해에 도움이 되도록 Models.py 코드 일부를 추가한다.

 

class Idea(models.Model):
    title = models.CharField(max_length=64)
    image = models.ImageField(blank=True, upload_to='posts/%Y%m%d')
    content = models.TextField()
    interest = models.IntegerField(default=0)
    devtool = models.ForeignKey(
        Tool, on_delete=models.SET_NULL, related_name='idea_tool', null=True)

    def is_favorited(self):
        return IdeaStar.objects.filter(idea=self).exists()


class IdeaStar(models.Model):
    idea = models.ForeignKey(
        Idea, on_delete=models.CASCADE, related_name='like_idea')

 

View에는 POST 방식을 이용하여 POST 요청을 받으면

해당 요청의 맞는 name을 읽어 들이고, value가 일치하면 try except를 진행하는 방식으로 구성했다.

 

현재 POST 요청에 value로 담겨온 idea.pk 값을 pk로 삼는

Idea 모델의 객체를 idea_instance 변수에 담았다.

 

그리고 IdeaStar 모델의 객체중 idea_instance 객체를 외래키로 참조하는

객체( 이는 좋아요(즐겨찾기) 객체가 될 것이다. )가 존재한다면 해당 객체를 삭제하는

idea_star.delete()를 작성하였다.

 

이는 현재 즐겨찾기 상태에서 유저가 즐겨찾기 버튼을 누르면

해당 객체의 즐겨찾기 상태가 해제되는 것을 구현한 것이다.

 

그리고 IdeaStar.DoesNotExist 예외를 넣어주면서

현재 idea 객체가 즐겨찾기 상태가 아니면, 즐겨찾기 객체를 만들고

즐겨찾기 상태라는 것을 추가해줬다.

 

def posts_list(request, *args, **kwargs):
    idea = Idea.objects.all()

    if request.method == "POST":
        favorite_pk = request.POST.get('favorite_pk')
        action = request.POST.get('action')
        if favorite_pk and action == 'favorite':
            idea_instance = Idea.objects.get(pk=int(favorite_pk))
            try:
                idea_star = IdeaStar.objects.get(idea=idea_instance)
                idea_star.delete()
            except IdeaStar.DoesNotExist:
                idea_star = IdeaStar.objects.create(idea=idea_instance)
        else:
            pass
            
...

urls.py 같은 경우 본인의 프로젝트에 알맞게 수정해서 사용하면 된다.

반응형