[1차 프로젝트]2-유저/상세페이지 정보 불러오기

모델링을 마치고 초기세팅 후 팀원들끼리 어떤 기능을 담당할 지 정하는 시간을 가졌습니다. 저희팀이 구현하고자 했던 기능들을 크게 나누면 다음과 같습니다.

  • 회원가입/로그인
  • 마이페이지/유저페이지 유저정보 가져오기
  • login decorator 작성
  • 키워드에 따른 글 목록 가져오기
  • 태그에 따른 유저/글 목록 가져오기
  • 상세페이지에 포스트 정보 가져오기
  • faker data 구현
  • 댓글 기능 구현
  • 좋아요 기능 구현
  • 구독 기능 구현

저는 이 기능들 중에
1.마이페이지/유저페이지 유저정보 불러오기
2.상세페이지에 포스트 정보 가져오기
3.댓글 기능 구현을 담당했습니다.

해당 포스팅에서는 1.유저페이지/마이페이지 정보불러오기 2.상세페이지 포스트 정보 가져오기 부분에 대해 작성하겠습니다.

* 유저페이지 정보 불러오기/수정하기

class PublicUserView(View):
    def get(self, request, user_id):
        try:
            user = User.objects.get(id=user_id)

            result = {
                "user_id"      : user.id,
                "name"         : user.name,
                "nickname"     : user.nickname,
                "email"        : user.email,
                "description"  : user.description,
                "position"     : user.position,
                "github"       : user.github,
                "profile_photo": user.profile_photo
            }
            return JsonResponse({"message" : "SUCCESS", "result" : result}, status=200)
        
        except User.DoesNotExist:
            return JsonResponse({"message" : "INVALID_USER"}, status=401)

먼저 유저정보를 가져오는 기능입니다. 1차 프로젝트 때 저희가 담당한 프로젝트는 대부분 db에 있는 정보들을 가져오는 기능들이라 get을 사용하여 불러오는 경우가 대부분이였습니다.

다음은 유저정보 업데이트 기능입니다.

def post(self, request, user_id):
        try:
            data               = json.loads(request.body)
            user               = User.objects.get(id = user_id)
            email              = data.get("email", user.email)
            phone_number       = data.get("phone_number", user.phone_number)
            
            validate_email(email)
            validate_phone_number(phone_number)
            
            user.name          = data.get("name", user.name)
            user.nickname      = data.get("nickname", user.nickname)
            user.email         = email
            user.description   = data.get("description", user.description)
            user.position      = data.get("position", user.position)
            user.github        = data.get("github", user.position)
            user.profile_photo = data.get("profile_photo", user.position)
            user.phone_number  = phone_number
            user.save()
            
            return JsonResponse({"message":"SUCCESS"}, status=201) 
        
        except ValidationError: 
            return JsonResponse({"message" : "INVALID_VALUE"}, status=400)

유저정보를 업데이트 할 때 처음에는 어떻게 작성해야 하는지 막막했습니다. post함수에는 creat메소드를 사용해 db에 정보를 creat 하는 것만 생각했지 기존에 있던 정보를 수정하는 쪽으로는 생각하지 못했기 때문입니다.

하지만 천천히 생각해보고 검색을 해 본 결과 post함수를 통해서도 기존에 있던 정보를 변경할 수 있다는 것을 알았습니다.

처음에는

user.name          = data.get("name", user.name)
user.nickname      = data.get("nickname", user.nickname)
user.email         = email
user.description   = data.get("description", user.description)
user.position      = data.get("position", user.position)
user.github        = data.get("github", user.position)
user.profile_photo = data.get("profile_photo", user.position)

해당 부분에서 get메소드를 사용하지 않고 그냥 data["name"] 이런식으로 작성했습니다. 하지만 이렇게 작성할 경우 전체정보를 입력 하지 않고 내가 수정하고 싶은 일부의 정보만 입력할 때 keyerror 가 발생했습니다.

그래서 user.name = data.get("name", user.name) 이렇게 get메소드를 활용함으로써 수정하고 싶은 정보만 작성하고 작성하지 않는 정보들은 기존에 db에 저장되어 있는 정보를 불러오는 방향으로 작성하였습니다.

* 마이페이지 정보 불러오기

class PrivateUserView(View):
    @login_decorator
    def get(self, request):
        result = {
            "user_id"      : request.user.id,
            "name"         : request.user.name,
            "nickname"     : request.user.nickname,
            "email"        : request.user.email,
            "description"  : request.user.description,
            "position"     : request.user.position,
            "github"       : request.user.github,
            "profile_photo": request.user.profile_photo
            }
        
        return JsonResponse({"message" : "SUCCESS", "result" : result}, status=200)

마이페이지의 경우는 현재 로그인한 본인만 확인할 수 있는 페이지이기 때문에 login decorator를 통해 현재 로그인 한 본인만 볼 수 있도록 코드를 작성하였습니다.

처음에는 마이페이지가 로그인한 본인만 볼 수 있다는 점을 간과하여 계속 현재 로그인한 유저의 아이디와 유저의 아이디를 비교하여 같을 경우에만 마이페이지의 정보가 불러오도록 작성하려고 했습니다.

하지만 생각해보니 마이페이지는 결국 로그인한 본인만 볼 수 있기 때문에 위와 같이 한결 수월하게 코드를 작성할 수 있었습니다.

users.urls는 다음과 같이 작성하였습니다.

from django.urls import path, include

from .views      import PublicUserView, PrivateUserView

urlpatterns = [
path('/public/user/<int:user_id>', PublicUserView.as_view()),
path('/private/user', PrivateUserView.as_view())
]

* 포스팅 정보 불러오기

해당 기능은 해당 포스팅에 맞는 정보(타이틀,콘텐츠,작성시간 등)들을 불러오는 기능입니다. prev_posting/next_posting의 경우 다른 팀원이 작성한 부분입니다.

class PostView(View):
    def get(self, request, posting_id):
        try:
            posting      = Posting.objects.get(id=posting_id)
            prev_posting = Posting.objects.filter(id__lt=posting_id, user_id=posting.user_id).values('id', 'title').order_by('-id')[:1]
            next_posting = Posting.objects.filter(id__gt=posting_id, user_id=posting.user_id).values('id', 'title')[:1]

            results = {
                "posting_id"  : posting.id,
                "title"       : posting.title,
                "sub_title"   : posting.sub_title,
                "content"     : posting.content,
                "thumbnail"   : posting.thumbnail,
                "description" : posting.user.description,
                "nickname"    : posting.user.nickname,
                "created_at"  : posting.created_at,
                "updated_at"  : posting.updated_at,
                "posting_tags": list(posting.posting_tags.values("name")),
                "prev_posting": prev_posting[0] if prev_posting  else None,
                "next_posting": next_posting[0] if next_posting  else None,
            } 

            return JsonResponse({"message": "SUCCESS", "results" : results }, status=200)

        except Posting.DoesNotExist:
            return JsonResponse({"message" : "INVALID_POSTING"}, status=401)

PostView는 해당 포스팅 아이디를 가져와 포스팅 정보를 알려주고 만약 해당 포스팅 아이디가 존재하지 않을 경우 DoesNotExist를 통해 INVALID_POSTING이라는 메세지가 나오도록 코드를 작성하였습니다.

다음 포스팅에서는 댓글기능 구현에 대하여 포스팅하겠습니다.

좋은 웹페이지 즐겨찾기