수정을 할 때 사용하는 http method는 3가지가 있다
PUT / PATCH / POST
PUT은 일괄수정할 때, PATCH는 일부 수정할 때, POST는 등록이지만 수정에도 사용
이렇게 용도가 나뉜다고 하는데, 수정에도 POST를 쓴다는 이야기를 들었어서
이번에 POST로 구현하게 되었다.
from django.urls import path
from postings.views import PostingView, PostingUpdateView
urlpatterns = [
path('post', PostingView.as_view()),
path('delete/<int:id>',PostingView.as_view()),
path('post/<int:id>' ,PostingUpdateView.as_view())
]
등록과 수정 모두 같은 POST 메소드를 써도, 뒤에 <int:id> 라는 식별자를 통해
이게 등록인지 수정인지 구분이 된다.
라고 한다.
class PostingUpdateView(View) :
@login_decorator
def post(self, request, id) :
try :
#content => Posting
#img_url => Image
data = json.loads(request.body)
posting_id = id
posting = Posting.objects.get(id=posting_id)
image = Image.objects.filter(posting_id=posting_id)
content = data.get('content', posting.content)
img_url = data.get('img_url', image)
Posting.objects.filter(id=posting_id).update(content = content)
if img_url :
Image.objects.filter(posting_id=posting_id).delete()
for url in img_url :
Image.objects.create(
img_url = url,
posting = posting
)
return JsonResponse({'message':'update good'}, status=200)
except KeyError :
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except json.decoder.JSONDecodeError:
return JsonResponse({'message':'Json Decode Error'}, status=400)
수정의 경우, 등록과 마찬가지로 글만 쓰거나, 이미지만 올리거나로 나뉠 수 있기 때문에
둘 다 받아오되 없으면 기존의 것 그대로 사용
텍스트 내용에 대한 수정은 수정된 거면 수정된거 반영, 아니면 기존의 것 그대로 하도록 작성
이미지가 문제였는데, 이미지의 변경이 있으면 어떻게 반영해야 할지 고민이 많았다.
그래서 이미지의 변경이 있으면, 기존 걸 삭제하고 새 거를 추가하는 방식을 사용했다
이 부분은 조금 더 고민해봐야할듯;;;