ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] CRUD로 블로그 구현하기 (Update)
    Python & Django 2021. 6. 1. 23:27

    계속해서 update 기능을 만들어보도록 하겠습니다.


    1. Update 기능 설계

    update 기능은 create 와 유사합니다. 차이점은 새로운 객체를 만들어서 데이터를 넣어주는 것이 아니라, 기존의 데이터를 불러와 덮어씌운다는 것입니다.

     

    1. 기존의 데이터 불러오기(edit)

    2. 새로운 데이터로 덮어씌운 후 저장하기(update)


    2. 게시물 수정 페이지(edit)

    뷰 만들기

    edit 에서는 view.py 에서 우선 기존의 게시물을 불러와야 합니다. 아래 코드를 작성해 기존 게시물을 불러오는 edit 함수를 만듭니다.

    def edit(request, id):
        edit_blog = Blog.objects.get(id= id)
        return render(request, 'edit.html', {'blog': edit_blog})

    edit 함수를 만드는데, 기존의 게시물을 찾아와야 하기 때문에 매개변수로 request 뿐 아니라 id 도 전달해야 합니다.

     

    그리고 나서 Blog.objects.get(id= id) 로 Blog 모델의 객체들 중 get으로 매개변수로 받은 id 와 동일한 객체를 꺼내서 edit_blog 변수에 넣어줍니다.

     

    그리고 edit.html 을 불러오는데 딕셔너리로 blog 에 edit_blog를 값으로 전달해 줍니다.

     

    url 만들기

    edit 함수를 만들었으니, edit path 를 만듭니다.

    urlpatterns = [
        ...
        path('edit/<str:id>', edit, name="edit"),
    ]

    이때 url 에 edit/<str:id> 로 path-converter 를 사용해서 views.py 의 edit 함수에서 받은 객체를 id 로 찾아오도록 합니다.

     

    템플릿 만들기

    edit.html 을 만드는데, 실제로 edit 페이지는 새 글을 작성하는 new 페이지와 양식이 동일하기 때문에 new 에서 작성한 코드를 복붙하여 수정하겠습니다.

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
        ...
    </head>
    <body>
        <form action="{% url '' %}" method="POST">
            {% csrf_token %}
            <label for="title">제목</label>
            <input type="text" name="title" id="title" value="{{blog.title}}">
            <br>
            <label for="writer">작성자</label>
            <input type="text" name="writer" id="writer" value="{{blog.writer}}">
            <br>
            <label for="body">내용</label>
            <textarea name="body" id="body" cols="30" rows="10">{{blog.body}}</textarea>
            <button type="submit">제출</button>
        </form>
    </body>
    </html>

    일단 이후에 update 와 연결할 폼의 액션은 비워두고 폼을 수정합니다.

     

    수정할 부분은 각 컬럼의 input 태그인데 value 값으로 {{blog.title}} 을 넣어주면 views.py 의 edit 함수에서 render 로 전달한 'blog': edit_blog 의 데이터를 가져올 수 있습니다.

     

    body 에 해당하는 textarea 에는 value 가 아니라 태그 사이에 {{blog.body}} 를 넣어줍니다.


    3. 새로운 데이터로 덮어씌워 저장하기(Update)

    뷰 만들기

    우선 view.py 에서 update 함수를 만들겠습니다.

    def update(request, id):
        update_blog = Blog.objects.get(id= id)
        update_blog.title = request.POST['title']
        update_blog.writer = request.POST['writer']
        update_blog.body = request.POST['body']
        update_blog.pub_date = timezone.now()
        update_blog.save()
    
        return redirect('detail', update_blog.id)

    create 와 유사하지만, 기존의 게시물을 다루기 때문에 매개변수로 id 를 넣어줍니다. 그리고 Blog 에서 id 에 맞는 객체를 불러와서 각각의 컬럼들에 새 데이터를 넣어주고 저장합니다.

     

    그리고 update 된 blog 의 상세 페이지로 가도록 id를 넣어 redirect 해줍니다. 

     

    url 만들기

    urlpatterns = [
        ...
        path('update/<str:id>', update, name="update"),
    ]

    edit 과 마찬가지로 path-converter 로 path 를 만들어줍니다.

     

    템플릿 완성하기(edit.html)

    이제 앞서 만든 edit.html 의 폼을 views.py 의 edit 으로 연결해주기 위해 비워두었던 액션을 채워줍니다.

    <body>
        <form action="{% url 'update' blog.id %}" method="POST">
            {% csrf_token %}
            ...
        </form>
    </body>

    이때 update 액션에는 id 가 필요하기 때문에 blog.id 를 같이 전달해야 합니다.

     

    이제 서버를 열고 테스트해보겠습니다.

     

     

    첫번째 이미지는 기존 게시물의 수정하기 버튼을 눌렀을 때 기존 데이터를 잘 받아오는 모습이고, 두번째는 새로운 데이터를 입력한 모습, 세번째는 제출을 눌러 업데이트 했을 때 잘 작동하는 모습입니다.


    다음 포스팅에서는 삭제 기능을 만들면서 CRUD 를 마무리해보겠습니다.

     

Designed by Tistory.