@login_message_required def notice_edit_view(request, pk): notice = Notice.objects.get(id=pk) if request.method == "POST": if(notice.writer == request.user or request.user.level == '0'): form = NoticeWriteForm(request.POST, instance=notice) if form.is_valid(): notice = form.save(commit = False) notice.save() messages.success(request, "수정되었습니다.") return redirect('/notice/'+str(pk)) else: notice = Notice.objects.get(id=pk) if notice.writer == request.user or request.user.level == '0': form = NoticeWriteForm(instance=notice) context = { 'form': form, 'edit': '수정하기', } return render(request, "notice/notice_write.html", context) else: messages.error(request, "본인 게시글이 아닙니다.") return redirect('/notice/'+str(pk))
로그인한 사용자만 접근이 가능하도록 decorator를 추가하고, 글 수정을 개발자와 글작성자만 가능하게 하기 위해 GET, POST 요청 후에 검사를 진행하고 현재 접속 사용자와 글의 작성자가 일치하지 않으면 에러 메세지를 출력합니다
글 수정 view는 해당 게시글의 pk값인 id를 파라미터로 받습니다. 사용자가 게시글에서 글 수정 버튼을 클릭할 시 GET으로 글쓰기 폼을 context에 담아 넘겨줍니다. 기존의 제목과 내용 등 값들을 그대로 넘겨주기 위해 instance = 객체 형식으로 폼을 전달합니다. 또한 ‘’작성하기’’ 버튼 Text 대신 ‘’수정하기’’로 변경하기 위해 context에 담아 템플릿에 전달합니다.
글 수정 POST요청 또한 마찬가지로 권한 검사를 진행한 후 폼에 입력된 값들을 전달받아 is_valid가 통과되면 저장 후 성공 메세지를 출력합니다.
2. 글 삭제 View 작성
글 삭제 view 또한 글 수정과 마찬가지로 게시글의 pk값을 파라미터로 받고 권한 검사를 진행합니다. 아래와 같이 DB의 해당 row객체를 삭제하기 위해 delete() 메소드를 사용하는 소스를 입력합니다.
해당 게시글의 작성자가 아니라면 notice_auth가 False가 되어 수정과 삭제 버튼이 출력되지 않습니다. 수정 버튼은 onclick 이벤트로 해당 게시글의 id값 경로로 이동할 수 있게 하고, 삭제 버튼은 사용자가 삭제버튼을 클릭할 시 바로 삭제되지 않고 삭제경고창을 출력 후 진행하기 위해 Bootstrap modal을 활용합니다.
notice_wirite.html에 아래의 소스를 추가하여 앞서 구현한 글 수정 view에서 context로 전달된 edit 객체를 사용해 수정하기 상태라면 작성하기 텍스트 대신 수정하기 텍스트로 표시되게 합니다.