Django 개념

장고 좋아요 기능 구현하기

MC류짱 2022. 10. 13. 17:10

models.py

from django.db import models
from django.conf import settings

# Create your models here.
class Article(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    # 이 부분 !!!!!!=================================================================================
    like_users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='like_articles')
    # 이 부분 !!!!!!=================================================================================
    
    title = models.CharField(max_length=10)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title
  • 기존 Article(게시판)모델에 like_users필드 추가
  • ManyToManyField사용, 변수값 넣어주고, related_name을 정해줘야 함
  • related_name을 정해주지 않으면 기존 user필드의 역참조 매니저가 겹치게 됨

 

스키마

  • 게시글의 pk와 user의 pk가 저장됨

 

urls.py

from django.urls import path
from . import views


app_name = 'articles'
urlpatterns = [
    .....
    path('<int:article_pk>/likes/', views.likes, name='likes'),

]

 

 

views.py

@require_POST
def likes(request, article_pk):
    if request.user.is_authenticated:
        article = Article.objects.get(pk=article_pk)
        if article.like_users.filter(pk=request.user.pk).exists():
            # 좋아요 취소 (remove)
            article.like_users.remove(request.user)
        else:
            # 좋아요 추가 (add)
            article.like_users.add(request.user)
        return redirect('articles:index')
    return redirect('accounts:login')
  • 매개변수로 받은 article_pk로 해당 글을 찾고
  • 그 글의 like_users필드에 request.user.pk가 있다면(이미 좋아요를 누른 상황), (DB에 저장되어 있는 상황)
  • 해당 레코드 삭제
  • 없다면 레코드 추가

 

html (submit형태로 넣어주기)

<form action="{% url 'articles:likes' article.pk %}" method='POST'>
        {% csrf_token %}
        <button style='border:none;'>
          {% if request.user in article.like_users.all %}
            <i class="far fa-heart" style="color:red; font-size: 17px;"></i>
          {% else %}
            <i class="fas fa-heart" style="color:red; font-size: 17px;"></i> 
          {% endif %}
        </button>
        <span class="small">
          {{ article.like_users.all|length }} 명이 이 글을 좋아합니다.
        </span>
      </p>
      <a href="{% url 'articles:detail' article.pk %}">[DETAIL]</a>
    </form>
  • 폰트 어썸을 연결시켜 놨다면 <i class='far fa-heart>태그를 통해 하트 모양으로 바꿀 수 있음
  • 아니라면 단순히 input:submit으로 해줘도 됨

 

홈페이지