티스토리 뷰

728x90

 

 

 

 

[ 두번째 프로젝트 ] 

 

 

스파르타 뉴스를 만들어 보자.

 

 

 

 

++  팀 스로젝트로 팀과의 협업이 중요하다.

++  장고 공식 문서는 항상 확인하기 

https://docs.djangoproject.com/en/4.2/

 

 

https://github.com/1489ehdghks/spartaNews

 

GitHub - 1489ehdghks/spartaNews

Contribute to 1489ehdghks/spartaNews development by creating an account on GitHub.

github.com

 

 

 

 

 

 

1.  먼저 팀프로젝트를 하기 위해 git 협업준비

  • 빈 파일에 git init 을 해준다.
  • 그 다름 git clone https://~  주소를 복사해서 넣어준다.

 

 

 

  • requirements.txt 가 있는 폴더로 들어가 깔아준다.
pip install -r requirements.txt

 

 

 

 

 

 

 

 

 

 

 

 

2.  먼저  articles 의 기본세팅을 해주자.

 

  • articles 앱을 생성하고 기본적인 url 구조를 만들자.
  • python manage.py startapp articles
  • spartaNews 에서 settings.py 에서 app등록
  • spartaNews 에서 urls.py 에서 articles 의 urls.py 경로를 넣어준다.
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/', include('articles.urls')),

]

 

  • articles 에 urls.py 를 만들어 주고 그 안에 일단 기본 세팅을 해준다.
from django.urls import path

urlpatterns = []

 

 

 

 

 

 

 

 

 

 

 

3.  댓글을 구현해보자.

 

  • 구현하여야할 것 :
    • 작성 - 내용
    • 조회 - 작성자, 시간,  게시글안에서만 조회
    • 삭제,수정

 

  • articles에서 models.py를 추가하기
from django.db import models

class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name="comments")
    content = models.TextField()
    # 작성자 필드 추가
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

  • 마이그레이션을 해주어야하는데 아직 article 이 되어있지 않아서 팀원분이 article을 하고 나서 마이그래잇하고 확인을 해보자.
python manage.py makemigrations
python manage.py migrate

 

  • articles에 serializers.py 를 추가하기
from rest_framework import serializers
from .models import Article, Comment

...

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = "__all__"

 

 

 

 

 

 

 

 

 

 

 

4.  댓글 조회하기.

  • articles에 urls.py 에 추가하기
from django.urls import path
from . import views

urlpatterns = [
  path(
        "<int:article_id>/comments/", # 댓글조회하기
        views.CommentListAPIView.as_view(),
        name="comment_list",
    ),
]

 

  • articles에 views.py 에 추가하기
from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse, HttpResponse
from django.core import serializers
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework import status
from rest_framework.views import APIView
from .serializers import ArticleSerializer, ArticleDetailSerializer, CommentSerializer
from .models import Article, Comment

...

class CommentListAPIView(APIView):
    def get(self, request, article_id):
        article = get_object_or_404(Article, pk=article_id)
        comments = article.comments.all()
        serializer = CommentSerializer(comments, many=True)
        return Response(serializer.data)

    def post(self, request, article_id):
        pass

 

 

  • 브렌치를 생성하여 git에 push 한다.
git checkout -b 브렌치이름   # 브렌치 생성

git add .
git commit -m "first commit"
git push origin 브렌치이름  #브렌치 이름으로 push

 

 

 

 

 

 

 

 

 

 

5.  댓글 생성하기

  • articles에 views.py 에 추가하기
class CommentListAPIView(APIView):
    ...
   def post(self, request, article_id):
        article = get_object_or_404(Article, pk=article_id)
        serializer = CommentSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save(article=article)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
  • serializer.is_valid 를 통과하지 못합니다.이럴 때는 read_only_fields 를 설정해서 특정 필드를 직렬화 로직에 포함하지 않고 반환 값에만 필드를 포함하도록 할 수 있습니다.
  • → serializer 입장에서는 내가 넘겨받은 데이터에 article 정보가 없기 때문입니다!
  • CommentSerializer 에 read_only_fields = ("article",) 를 추가해야한다.
class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = "__all__"
        read_only_fields = ("article",)

 

 

 

 

 

 

 

 

 

 

 

6.  댓글 삭제하기

  • articles에 urls.py 에 추가하기
path(
    "comments/<int:comment_id>/",
    views.CommentDetailAPIView.as_view(),
    name="comment_detail",
),

 

 

  • articles에 views.py 에 추가하기
from .models import Article , Comment

class CommentDetailAPIView(APIView):
  # 댓글 삭제하기
    def delete(self, request, comment_id):
        comment = get_object_or_404(Comment, pk=comment_id)
        comment.delete()
        data = {"id": f"{comment_id} is deleted."}
        return Response(data, status=status.HTTP_200_OK)

 

 

 

 

 

 

 

 

 

 

 

7.  댓글 수정하기

 

  • articles에 views.py 에 추가하기
class CommentDetailAPIView(APIView):
    def get_object(self, comment_pk):
        return get_object_or_404(Comment, pk=comment_pk)

    def put(self, request, comment_pk):
        comment = self.get_object(comment_pk)
        serializer = CommentSerializer(comment, data=request.data, partial=True)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data)

위와 같음

class CommentDetailAPIView(APIView):
    def put(self, request, comment_pk):
        comment = get_object_or_404(Comment, pk=comment_pk)
        serializer = CommentSerializer(comment, data=request.data, partial=True)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data)

 

 

 

 

 

  • merge 병합하기 - github에서 직접 병합함...ㅎㅎ
git pull origin dev      # 먼저 풀 받아옴
git add .                # 저장
git commit -m "merge"    # 커밋
git push origin hwanhee  # 브렌치에 푸쉬

 

 

  • 브렌치명 변경
git checkout main                  # 현재 브렌치 말고 다른 브렌치로 이동
git branch -m Comments             # 새로운 브렌치 (변경하고 싶은 브렌치) 생성
git pull origin hwanhee            # 변경하고 싶은 브렌치 파일 가져옴
git add .                          # 저장
git push origin Comments           # 새로운 브렌치에 푸쉬
git branch -d hwanhee              # 로컬에서 브렌치 지움
git push origin --delete hwanhee   # 깃허브에서 브렌치 지움

 

 

 

반응형
반응형
TAG
more
최근에 올라온 글