-
[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 를 마무리해보겠습니다.
'Python & Django' 카테고리의 다른 글
[Django] Template 상속 (0) 2021.06.02 [Django] CRUD 로 블로그 구현하기 (DELETE) (0) 2021.06.01 [Django] CRUD로 블로그 구현하기(CREATE) (0) 2021.06.01 [Django] get_object_or_404 로 404 페이지 만들기 (0) 2021.06.01 [Django] CURD 로 블로그 구현하기(READ) (0) 2021.06.01