[Django/게시판 좋아요 기능 추가하기]

SooYeon Yeon·2022년 6월 26일
0

Django

목록 보기
10/20

이해

  • 하나의 회원은 여러개 게시물 가능

  • 하나의 게시물은 여러 회원의 이해 좋아요 받을 수 있다.

  • 그러므로 회원-게시물은 다대다 관계

  • 누가 누구를 눌렀는지를 하면 됨

  • 하나의 사용자는 댓글 여러개 가능

  • 하나의 게시물은 여러개 댓글 달아지는거 가능

좋아요 기능 추가하기

post model

from django.contrib.auth.models import User
from django.db import models

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=40)
    contents = models.TextField()
    create_date = models.DateTimeField(auto_now_add=True)

    # writer은 다른 모델을 참조하겠다.(User) 외래키 추가
    writer = models.ForeignKey(User, on_delete=models.CASCADE) # on_delete : User가 delete 될 때 게시글을 어떻게 설정한 것인지에 대해 설정 1. 게시글 같이 지우기(CASCADE) 2. 없는 값으로 해서 게시글은 남겨두기
    # 다대다 관계는 ManyToManyField, 아무도 누르지 않을 수 있으니 blank가 True, 참조할 때 이름을 지어줌(위에서랑 겹치지않게)
    like = models.ManyToManyField(User, related_name='likes' ,blank=True)
    def __str__(self):
        return 'id : {}, title : {}'.format(self.id, self.title, self.contents)

이후 makemigrations → migrate

비동기 통신?

  • 좋아요 눌렀을 때 다 다시 서버에서 받아오지말고 좋아요 추가돼서바뀌었다는것만 알아오자 =비동기통신
  • url이 바뀌지않고, 페이지 그대로에서 작업을 하는 것임. 그 부분데이터만 가져다가 해당 데이터에 대한것만 받아옴
  • 비동기처리는 js에서 수행함.

urls.py

path('like/<int:bid>',board.views.like),

main.html

function sendRequest(bid) {
			var httpRequest = new XMLHttpRequest();
			httpRequest.onreadystatechange = function() {
				if (httpRequest.readyState == XMLHttpRequest.DONE && httpRequest.status == 200 ) {
					document.getElementById("text").innerHTML = httpRequest.responseText;
				}
			};
			// GET 방식으로 요청을 보내면서 데이터를 동시에 전달함.
			httpRequest.open("GET", "/like/"+bid, true);
			httpRequest.send();
		}

추가함 (코드블록 안에 안에)

하트 부분 클릭시 해당 함수가 실행되게 하도록 설정, 태그 안에 내용을 바꾸게 하기 위해 this 추가

<p class="post-meta" onclick="sendRequest({{ post.id }}, this)">
                            {% if request.user in post.like.all %}
                            ♥ {{ post.like.count }}
                            {% else %}
                            ♡ {{ post.like.count }}
                            {% endif %}
                        </p>

views.py

@login_required(login_url='/accounts/login')
def like(request,bid):
    # 어떤 게시물에, 어떤 사람이 like를 했는 지
    post = Post.objects.get(id=bid) # 게시물 번호 몇번인지 정보 가져옴
    user = request.user
    if post.like.filter(id=request.user.id).exists(): # 유저면 알아서 유저의 id로 검색해줌
        post.like.remove(user)
        return JsonResponse({'message': 'deleted', 'like_cnt' : post.like.count() })
    else:
        post.like.add(user) # post의 like에 현재유저의 정보를 넘김
        return JsonResponse({'message': 'added', 'like_cnt' : post.like.count()})

위지위그 - 내 글 꾸밀수있게하는거

했는데 태그가 그대로 출력되는 경우 post.contents | safe 로 바꾸어준다

0개의 댓글