728x90
다대다(M:N) 관계 인스타ERP 등
ERP/게시글 유저저장
ERP/게시글 댓글작성
ERP/댓글 좋아요
관계정리
무작정따라하기
가상환경만들기
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 가있다.
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