카테고리 없음

[django] ERP/ 좋아요 기능 구현하기

황성안 2021. 3. 31. 23:06
728x90

다대다(M:N) 관계 인스타ERP 등

 

ERP/게시글 유저저장

 

image-20210331125549216image-20210331125556230

ERP/게시글 댓글작성

 

 

 

ERP/댓글 좋아요

 

 

image-20210331125855777

 

 

image-20210331125942885

관계정리

image-20210331130338597

 

 

무작정따라하기

가상환경만들기

activate 하기

pip install -r requi 하기

migrate 하기

준비 완료

시작하기

article models.py 외래키 추가

좋아요를 누른 유저.(다대다) related_name 을 꼭해주셔야해용

like_users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='like_articles', )

역참조가 충돌하기떄문에

# related_name='like_articles' # User 모델을 위한 설정
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)
    title = models.CharField(max_length=10)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    like_users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='like_articles', )

    def __str__(self):
        return self.title


class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    content = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.content

그후 makemigrations. migrate 를하면

db를 보게되면 articles_article_like_users 가있다.

image-20210331132312963

UI만들기

서버키기

python manage.py runserver

 

좋아요 만들기

templates > detail.html

아래 코드를 적절한 곳에 위치시켜준다.

  <form action="{% url 'articles:like' article.pk %}" method="POST">
    {% csrf_token %}
    <button>좋아요!</button>
  </form>

 

articles > urls.py

파일로이동

from django.urls import path
from . import views


app_name = 'articles'
urlpatterns = [
    path('', views.index, name='index'),
    path('create/', views.create, name='create'),
    path('<int:pk>/', views.detail, name='detail'),
    path('<int:pk>/delete/', views.delete, name='delete'),
    path('<int:pk>/update/', views.update, name='update'),
    path('<int:pk>/comments/', views.comments_create, name='comments_create'),
    path('<int:article_pk>/comments/<int:comment_pk>/delete/', views.comments_delete, name='comments_delete'),

    #like
    # ex) 주소/article/1/like
    path('<int:pk>/like/', views.like, name='like'),
]

 

article > views.py
@require_POST
def like(request, pk):
    if not request.user.is_authenticated:
        return redirect('accounts:login')
    # 1. 내가 좋아요 누른 게시글을 가져오기
    article = Article.objects.get(pk=pk)
    # 2. 해당 게시글의 좋아요 유저 목록에 
    # 이전에 좋아요 누른적이있는지?
    if article.like_users.filter(pk=request.user.pk).exists():
        article.like_users.remove(request.user)
    # "나"를 추가합니다.
    else:
        article.like_users.add(request.user)
    return redirect('articles:detail', article.pk)

좋아요 몇명 표시

detail. html
<p>{{ article.like_users|length }} 명이 이 글을 좋아합니다.</p>

안됨..

아래는 되는거

<p>{{ article.like_users.count }} 명이 이 글을 좋아합니다.</p>
<p>{{ article.like_users.all|length }} 명이 이 글을 좋아합니다.</p>

.count 가 더 빠르다.

 

728x90