오늘은 QnA구현을 위한 View를 작성했습니다.
저희는 QnA창 구성을 question게시물을 달로 그 밑에 댓글형식으로 answer를 달아주는 형태를 만들 것입니다.
먼저 질문창부터 View를 살펴보겠습니다.
(아직 오류반환하는 코드는 작성하지 않았습니다.)
import json
from django.views import View
from django.http import JsonResponse
from questions.models import Answer,Question
from questions.decorator import log_in_decorator
class QuestionView(View):
@log_in_decorator #로그인한 유저만 접근이 가능하게 데코레이터 사용
def post(self,request):
data = json.loads(request.body) #json형태의 요청을 파이썬 형태로 변환
title = data['title']
detail = data['detail']
user_id = request.user.id #데코레이터에서 가져온 request.user의 id값 저장
Question.objects.create(
title = title,
detail = detail,
user_id = user_id
)
return JsonResponse({'message':'생성완료'},status=200)
@log_in_decorator
def get(self,request):
questions = Question.objects.all() #question데이터를 모두 가져온다
result = [] #result에 빈리스트를 저장해준다.
for question in questions: for문으로 쿼리안에 있는 객체를 하나씩 전달해준다.
result.append({
'title' : question.title,
'detail' : question.detail,
'user_id' : question.user_id,
'created_at' : question.created_at
})
return JsonResponse({'result':result},status=200) #result값을 전달해준다.
@log_in_decorator
def delete(self,request):
user = request.user
data = json.loads(request.body)
question_id = data['question_id']
question = Question.objects.get(id=question_id) #전달받은 question_id값과 Question안 id값이 같은 객체의 정보를 question라는 변수에 담겨줍니다.
Question.objects.filter(id=question.id).delete() #필터를 써서 question안 id와 같은 id를 삭제해준다.
return JsonResponse({'mesaage':'삭제완료'},status=200)
이제 answer를 살펴봅시다.
class AnswerView(View):
@log_in_decorator
def post(self,request):
data = json.loads(request.body)
user = request.user
writer = user.email #로그인한 유저의 이메일정보를 가져 옵니다.
detail = data['detail']
question_id = data['question_id']
question = Question.objects.get(id=question_id) #요청받은 question_id와 Question에 id값이 같은 객체를 question에 담아 준다.
Answer.objects.create(
writer = writer,
detail = detail,
question_id = question.id #question에 id값 추출
)
return JsonResponse({'message':'댓글등록'},status=200)
@log_in_decorator
def get(self,request):
answers = Answer.objects.all()
result = []
for answer in answers:
result.append({
'writer' : answer.writer,
'detail' : answer.detail,
'question_id' : answer.question_id,
'created_at' : answer.created_at
})
return JsonResponse({'result':result},status=200)
@log_in_decorator
def delete(self,request):
data = json.loads(request.body)
answer_id = data['answer_id']
answer = Answer.objects.get(id=answer_id)
Answer.objects.filter(id=answer.id).delete()
return JsonResponse({'message':'삭제완료'},status=200)
이제 api큰틀을 만들었으니 각종류를 반환하는 코드들을 적어 봅시다~
import json
from django.views import View
from django.http import JsonResponse
from questions.models import Answer,Question
from questions.decorator import log_in_decorator
from json.decoder import JSONDecodeError
class QuestionView(View):
@log_in_decorator
def post(self,request):
try:
data = json.loads(request.body)
title = data['title']
detail = data['detail']
user_id = request.user.id
Question.objects.create(
title = title,
detail = detail,
user_id = user_id
)
return JsonResponse({'message':'생성완료'},status=200)
except KeyError:
return JsonResponse({'message':'키에러'},status=400)
except JSONDecodeError:
return JsonResponse({'message':'json형태이상함'})
@log_in_decorator
def get(self,request):
questions = Question.objects.all()
result = []
for question in questions:
result.append({
'id' : question.id,
'title' : question.title,
'detail' : question.detail,
'user_id' : question.user_id,
'created_at' : question.created_at
})
return JsonResponse({'result':result},status=200)
@log_in_decorator
def delete(self,request):
try:
user = request.user
data = json.loads(request.body)
question_id = data['question_id']
question = Question.objects.get(id=question_id)
if not user.id != question.user_id:
return JsonResponse({'message':'권한없음'},status=400)
Question.objects.filter(id=question.id).delete()
return JsonResponse({'mesaage':'삭제완료'},status=200)
except KeyError:
return JsonResponse({'message':'키에러'},status=400)
except Question.DoesNotExist:
return JsonResponse({'message':'삭제할 질문이 존재하지 않습니다.'},status=400)
except JSONDecodeError:
return JsonResponse({'message':'json형태이상함'},status=400)
class AnswerView(View):
@log_in_decorator
def post(self,request):
try:
data = json.loads(request.body)
user = request.user
writer = user.email
detail = data['detail']
question_id = data['question_id']
question = Question.objects.get(id=question_id)
Answer.objects.create(
writer = writer,
detail = detail,
question_id = question.id
)
return JsonResponse({'message':'댓글등록'},status=200)
except KeyError:
return JsonResponse({'message':'키에러'},status=400)
except JSONDecodeError:
return JsonResponse({'message':'json형태이상함'},status=400)
@log_in_decorator
def get(self,request):
answers = Answer.objects.all()
result = []
for answer in answers:
result.append({
'id' : answer.id,
'writer' : answer.writer,
'detail' : answer.detail,
'question_id' : answer.question_id,
'created_at' : answer.created_at
})
return JsonResponse({'result':result},status=200)
@log_in_decorator
def delete(self,request):
try:
data = json.loads(request.body)
answer_id = data['answer_id']
answer = Answer.objects.get(id=answer_id)
Answer.objects.filter(id=answer.id).delete()
return JsonResponse({'message':'삭제완료'},status=200)
except KeyError:
return JsonResponse({'message':'키에러'},status=400)
except Answer.DoesNotExist:
return JsonResponse({'message':'삭제할 답글이 존재하지 않습니다.'},status=400)
except JSONDecodeError:
return JsonResponse({'message':'json형태이상함'},status=400)