Contents
django 9 - 게시글의 삭제 및 수정
   2022년06월20일     3분정도면 다 읽어요     - Comments

[카카오 클라우드 스쿨] 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 . 결과

  • img_69
  • img_70
  • img_71



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 페이지로 남는 것이 아님

3 . 하단부에 이렇게 고쳐주면 FORM을 사용해서 모델의 객체를 반환받아 바로 사용할 수 있다

# 값이 유효한지 검증
if postForm.is_valid():
    post = postForm.save(commit=False)  # 좋은 예 (commit: 굳이 저장을 안 시키고, 모델의 객체를 반환한다)
    post.save()  # 저장

    # 수정이 완료되면 해당 게시글로 이동하게 함
    return redirect('/boardpan/readGet/' + str(post.id))


이로써 CRUD가 가능한 Board 앱의 완성!!


참고: jekyll 블로그 특성항 템플릿 언어 { {, { % 등등이 적용이 안되어 불가피하게 공백을 삽입했어요
원래는 공백 있으면 안돼요