해리의 데브로그

Django 07 - CRUD 4 (Delete, Update)

|

Model을 활용한 CRUD 구현 (4)

Delete (Delete 페이지 구현)

  • views.py & urls.py
    • detail 함수를 작성했던 방식과 매우 유사함.
    • urls 주소의 post_id 를 variable routing으로 사용하여, 함수 내 특정 레코드를 갖고오는 id 값으로 사용.
    • post.delete() 이용하여 레코드를 삭제 한 후, list 페이지인 ‘/posts/’ 로 redirect 시킴.
#views.py
def delete(request, post_id):
    post = Post.objects.get(pk=post_id)
    post.delete()
    return redirect('/posts/')

#urls.py
urlpatterns = [
    path('<int:post_id>/delete/', views.delete),
]
  • detail.html
    • 게시글을 삭제하는데는 추가적인 웹페이지를 작성할 필요가 없음.
    • 따라서, 레코드의 세부정보를 보여주는 details.html에 내용을 구현할 수 있음.
    • <a href="/posts//delete/">Delete</a>
    • id값을 불러오기 위해 템플릿 변수를 사용하여 삭제 기능을 동적으로 구현.
<-- details. html-->
<body>
    <h1>Post Detail</h1>
    <h2>Title : </h2>
    <p> Content : </p>
    <a href="/posts/">List</a>
    <a href="/posts//delete/">Delete</a>
</body>    

Update(Edit & Update 페이지 구현)

게시판 글을 수정하기 위해서는 어떠한 레코드를 수정할건지에 대한 정보가 필요하므로 다시 id값을 받아야함. new & create 페이지에서 우리는 아래와 같이 페이지의 역할을 구분했었음.

  • new.html: 내용 입력 Form을 작성. 작성된 내용을 /posts/create/로 전달하는요청을 보냄
  • create 함수: /posts/create/ 로 url이 접근되면, 함수가 실행되어, 데이터베이스에 내용을 저장시킴.

마찬가지로, 글을 수정하는 페이지도 역할을 아래와 같이 2가지로 구분하여 작성해야함.

  • edit.html : 내용을 수정하는 Form을 작성하는 페이지.수정된 내용을 posts/[id값(템플릿변수)]/update으로 전달하는 요청을 보냄.
  • update 함수 : posts/[id값(템플릿변수)]/update url을 사용자가 입력하면 update 함수가 실행됨.

Edit 페이지 구현

  • views.py & urls.py
    • 기본주소/[id값]/edit/ url으로 서버에 요청을 보내면, urlpattern에 따라 edit 함수가 실행됨.
    • post_id 는 variable routing으로 `edit 함수의 두번째 파라미터로 받아옴.
    • 이 값을 가지고 DB의 특정 레코드에 접근.
    • 레코드 값이 저장된 post 변수를 html 파일에서 사용하기 위해 템플릿 변수로 지정.
#views.py
def edit(request, post_id):
    post = Post.objects.get(pk=post_id)
    return render(request, 'edit.html', {'post':post})

#urls.py
urlpatterns = [
    path('<int:post_id>/edit/', views.edit),
]
  • edit.html
    • input 태그의 내용에는 변경사항을 실어서 update 주소로 보냄.
    • 기존에 입력된 내용을 보기 위해, 템플릿 변수로 연결된 post라는 인스턴스의 멤버변수인 post.titlepost.content 를 value 속성의 값으로 저장.
    • 이를 통해 edit.html이 실행될 때, input 태그의 value에 기존의 데이터를 볼 수 있게됨.
    • 어떠한 레코드를 수정하는지에 대한 정보가 들어가야하므로, post.pk 변수는 variable routing으로 사용하여, update주소로 요청을 보냄.
    • 요청방식은 POST가 사용되었기 때문에, 추가로 csrf_token 을 입력.

<body>
    <h1>Post Edit</h1>
    <form action="/posts/{{ post.pk }}/update/", method="POST">
        {% csrf_token %}
        <input type="text" name="title" value="{{ post.title }}"/>
        <input type="text" name="content" value="{{ post.content }}"/>
        <input type="submit" value="Submit"/>
    </form>
</body>

update 페이지 구현

  • views.py & urls.py
    • variable routingpost_id를 통해 우리는 수정하고자 하는 레코드를 반환.
    • Post 클래스의 인스턴스 객체인 post 의 멤버변수를 edit.html - form 태그에 작성된 내용으로 업데이트 시킴.
    • 이후 .save() 을 통해 DB에 내용을 저장시킴.
#views.py
def update(request, post_id):
    #수정하는 코드
    post = Post.objects.get(pk=post_id)
    post.title =request.POST.get('title')
    post.content =request.POST.get('content')
    post.save()
    return redirect(f'/posts/{post_id}/')

#urls.py
urlpatterns = [
    path('<int:post_id>/update/', views.update),
]

게시글을 업데이트 하고싶을 때 마다 /posts//edit/ url주소를 직접 입력하는 방법은 매우 비효율적일 것이다. 따라서, 레코드의 세부정보를 보여주는 detail.html에 게시글을 업데이트하는 내용을 구현하도록 하자.

  • detail.html
    • delete 때와 마찬가지로, a 태그와 id값을 템플릿 변수로 적절히 활용하여 edit 함수를 실행시키는 링크를 작성.
<body>
    <h1>Post Detail</h1>
    <h2>Title : </h2>
    <p> Content : </p>
    <a href="/posts/">List</a>
    <a href="/posts//edit/">Edit</a>
    <a href="/posts//delete/">Delete</a>
</body>    

Comments