django 9 - 게시글의 삭제 및 수정
[카카오 클라우드 스쿨] django 9 - 게시글의 삭제 및 수정
게시글의 삭제 및 수정 구현
9-1. 삭제
1 . views.py 수정
from django.shortcuts import render, redirect
def deleteGet(request, bid):
# q는 여기서 안써도 됨
post = Post.objects.get(id=bid)
# 바로 그냥 삭제
post.delete()
# render 말고 redirect를 사용해 보기
return redirect('/boardpan/listGet')
HttpResopnse: 문장 하나만 출력한다
redirect: URL을 통해 이동한다, render와는 달리 context 값을 전달하지는 못함(클라에게 데이터 전달 불가)
render: 템플릿(html)을 직접 불러 이동한다, context 값 전달 가능
나중에 React 공부할때 쯤이면 세개 다 안씀 (json씀)
2 . 삭제하는 URI 생성하기
...
path("boardpan/deleteGet/<int:bid>", boardpan.views.deleteGet)
3 . 따라서 create 또한 render를 굳이 쓰지 않고 redirect로 변경 가능 (상관없긴 함)
views.py 중 def create(request):
...
# return redirect(request, 'boardpan/createResult.html')
return redirect('/boardpan/readGet/' + str(post.id))
- readGet/게시물번호로 이동하므로 create는 id를 사용하는 URI 생성 불필요
4 . 결과
9-2. 수정
데이터 수정하는 가능을 추가해 보자
1 . URL 생성하기
...
path("boardpan/update/<int:bid>", boardpan.views.update)
2 . views 함수 추가하기
- views에서는, 수정할 게시글 번호가 몇 번인지 알아야 함
- 서버로부터 불러 와서(get) 내용을 수정하고 보내야 함(post)
- POST와 GET 둘다 필요
# 조회한다 - (조회한 내용을 고찬 것을)생성한다 를 함수 하나에 입력할 것
def update(request, bid): # 몇번 게시글을 수정할 건지 번호를 지정해서 수정 -> delete url 추가 필요
# 게시글 조회를 먼저 해야 함, ID 에 맞는 데이터를 조회한다
post = Post.objects.get(id=bid)
# 요청한 게 get이면 수정하는 페이지를 뜨게 함
if request.method=="GET":
# 입력하는 곳에 조회한 내용(post)가 미리 들어가 있도록 함
postForm = PostForm(instance=post)
# 즉 form 양식을 context에 담아서 브라우저에 띄우도록 한다 (전송)
context = { 'postForm' : postForm }
# updates.html을 새로 만들어도 되고, create 입력 양식을 그대로 써도 무방하다
return render(request , 'board/create.html', context)
# 요청한 게 post면 양식 제출하기
elif request.method == "POST":
# 원래 게시판에 있던 원본을 대체한다
postForm = PostForm(request.POST, instance=post)
# 값이 유효한지 검증
if postForm.is_valid():
post.title = postForm.cleaned_data['title'] # 나쁜 예
post.contents = postForm.cleaned_data['contents'] # 나쁜 예
post.save() # 저장
# 수정이 완료되면 해당 게시글로 이동하게 함
return redirect('/boardpan/readGet/' + str(post.id))
- 템플릿의 경우 create.html을 그대로 사용한다
- create.html에서
태그 내 action=create(URI)를 지워야함, create 페이지로 남는 것이 아님
- create.html에서
3 . 하단부에 이렇게 고쳐주면 FORM을 사용해서 모델의 객체를 반환받아 바로 사용할 수 있다
# 값이 유효한지 검증
if postForm.is_valid():
post = postForm.save(commit=False) # 좋은 예 (commit: 굳이 저장을 안 시키고, 모델의 객체를 반환한다)
post.save() # 저장
# 수정이 완료되면 해당 게시글로 이동하게 함
return redirect('/boardpan/readGet/' + str(post.id))
이로써 CRUD가 가능한 Board 앱의 완성!!
참고: jekyll 블로그 특성항 템플릿 언어 { {, { % 등등이 적용이 안되어 불가피하게 공백을 삽입했어요
원래는 공백 있으면 안돼요