AI웹 개발자 과정 공부 (팀스파르타)/프로젝트
24.05.07_TIL ( 팀 프로젝트 : 스파르타 뉴스 Django ) _ 1. git & 댓글 구현
티아(tia)
2024. 5. 7. 15:40
728x90
[ 두번째 프로젝트 ]
스파르타 뉴스를 만들어 보자.
++ 팀 스로젝트로 팀과의 협업이 중요하다.
++ 장고 공식 문서는 항상 확인하기
https://docs.djangoproject.com/en/4.2/
https://github.com/1489ehdghks/spartaNews
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 # 깃허브에서 브렌치 지움
반응형