그리고 사진은 media 폴더 안에 해당 연도 폴더 안에 해당 월 폴더에 저장되도록 경로를 설정했다
중간에 이미지가 잘 저장됐을 때 주소창에 기본주소/media/이미지파일이름 을 치면 이미지가 나오는 걸 튜터님이 보여주셨다
근데 나는 아무리 해도 page not found 오류가 떴다...
에러를 그냥 복사해서 구글에 검색해보기도 하고 에러 페이지를 정독하기도 했는데 어느 순간 머리에 느낌표가 생겼다
나는 models.py를 수정해서 이미지를 업로드 하면 media 폴더 안에 2023 폴더 안에 04월 폴더에 사진이 저장되게끔 했는데 튜터님이 하신 그대로 기본주소/media/이미지파일이름 으로 접속하고 있던 거였다 실제 이미지 파일은 미디어 폴더 아래에 바로 있는 게 아니라 2023/04/를 추가해줬어야 했다 다시 기본주소/media/2023/04/이미지파일이름 을 하니까 이미지가 제대로 나왔다
그리고 models.py를 수정한 후에 makemigrations와 migrate를 잊지 말 것!!
- 게시글 리스트와 작성 serializers.py, views.py 그리고 포스트맨으로 테스트하기
게시글 리스트
먼저 2주차 때 했던 것처럼 articles 앱에 serializers.py 파일을 생성한다
ArticleSerializer를 만든다
# articles/serializers.py
from rest_framework import serializers
from articles.models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = "__all__"
2주차에 했던 거 복붙해왔다 ㅎ
다음은 views.py를 작성한다
# articles/views.py
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from articles.models import Article
from articles.serializers import ArticleSerializer
class ArticleView(APIView):
def get(self, request):
"""전체게시글 조회"""
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
이것도 2주차 때 했던 걸 참고하면 된다
articles 변수에 Article 모델의 오브젝트들을 모두 담고
이걸 그냥 Response에 담으면 뭐 안 읽힌다 그랬나 쿼리셋 어쩌고 했던 것 같은데...여튼 그래가지고 시리얼라이저가 필요하다
serializer 변수에 위에서 만든 ArticleSerializer를 여러 개 가져올 수 있게 옵션을 설정해서 담는다
반환 값으로 Response를 보내면 끝
그냥 serializer를 반환하면 또 뭐 JSON 어쩌고 하면서 못 읽는다 시리얼라이저의 data를 반환해야 한다
포스트맨으로 가서 새 콜렉션을 만들고 articles list 라는 이름으로 리퀘스트 생성 후 저장한다
알맞은 URL을 입력하고 send를 누르면 게시글 목록이 뜨는 것을 확인할 수 있다
그런데 게시글 목록에 너무 많은 정보가 나오는 것 같다
content와 created_at은 게시글 목록에서 볼 땐 필요가 없을 것 같다
먼저 시리얼라이저를 새로 만들어준다
# articles/serializers.py
...
class ArticleListSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ("pk", "title", "image", "updated_at", "user")
2주차 때 아티클모델은 유저가 없고 컨텐트는 blank=True, null=True로 해서 타이틀만 필수 항목이었지만 이번에 만든 모델은 저 3가지가 필수 항목이다
특히 유저는 로그인한 사용자가 자동으로 입력되게끔 해줘야 하기 때문에 일단 로그인을 하고 로그인 정보를 게시글 헤더에 실어 보낼 것이다
일단 포스트맨에서 전에 만들어준 로그인 리퀘스트로 로그인을 실행한다
access 토큰을 복사해서 일단 Environment에 가서 token이라는 변수를 만들고 값에 붙여넣는다
다시 게시글만들기 리퀘스트로 가서 Header에 Key는 Authorization, Value에는 Bearer {{token}}을 넣어준다
이렇게 하고 타이틀과 컨텐트를 채워서 다시 send를 하면
여전히 유저를 넣어달라고 말한다
게시글 작성 함수에 가서 print(request.user)를 하고 다시 send를 누르면
일단 유저가 누구인지 인식은 하고 있다
다시 게시글 작성 함수로 가서 serializer 변수를 저장할 때 user=request.user를 넣어주면 user에 로그인한 사용자가 저장된다
serializer.save(user=request.user)
그런데 이렇게 해도 send를 보내면 여전히 user를 입력하라고 나온다
is_valid()에는 여전히 user가 빈 값이 들어가 있는데 ArticleSerializer에는 모든 필드를 입력하게끔 되어 있기 때문에 그렇다(생성시간, 업데이트 시간은 자동으로 되는 거라 입력해야 하는 값으로 인식하진 않는 것 같다)
어쨌든 ArticleCreateSerializer를 새로 생성해준다
필드에는 사용자가 입력할(=is_valid를 거쳐갈) 필드들만 넣어준다
# articles/serializers.py
...
class ArticleCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ("title", "image", "content")
이제 views.py에 가서 ArticleCreateSerializer를 import 해주고 게시글 작성 함수를 수정한다
위 이미지에 보이는대로 raw가 아닌 form-data에 체크한 다음 key값에 title, content, image를 넣고 value에는 내용을 적으면 되는데 image의 경우 File이라고 써있는 부분에 마우스를 올려놓으면 text로 할지 file로 할지 선택할 수 있다 file로 선택하면 value에 select file 버튼이 생긴다 그 버튼을 눌러 원하는 이미지를 선택한 다음 send를 하면 이미지가 업로드 되는 것을 확인할 수 있다
vscode 작업환경에 있는 media 폴더 안에 방금 업로드한 사진이 올라간 것을 확인할 수 있다