모델링을 마치고 초기세팅 후 팀원들끼리 어떤 기능을 담당할 지 정하는 시간을 가졌습니다. 저희팀이 구현하고자 했던 기능들을 크게 나누면 다음과 같습니다.
저는 이 기능들 중에
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이라는 메세지가 나오도록 코드를 작성하였습니다.
다음 포스팅에서는 댓글기능 구현에 대하여 포스팅하겠습니다.