2월 17, 2024

[Django] diary 만들어보기 (5) CRUD 구현- Update

https://www.programmingstory.com/2024/02/django-diary-4-crud-read.html

지난 포스팅에 이어 CRUD 중 update를 구현하는 방법에 대해서 알아보도록 하겠다. 


먼저 update를 하기 위해서는 각 일기마다 update를 할 수 있는 버튼을 만들어주도록 하겠다. 

show.html로 가서,

 <a href="{% url 'diary:edit' id=post.id %}">Edit</a>

이 부분을 추가해준다. 즉 전체 코드를 아래와 같이 작성해준다.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>My diary</title>
  </head>
  <body>
    <div>
      <a href="{% url 'diary:index' %}">return</a>
      <h1>Title: {{ post.title }}</h1>
      <h3>Satisfaction: {{ post.satisfaction }}</h3>
      <p>Content: {{ post.content }}</p>
      <a href="{% url 'diary:edit' id=post.id %}">Edit</a>
    </div>
  </body>
</html>

위에서는 edit url로 가라고 했는데 아직 edit가 없으므로, urls.py에 가서 추가를 해주도록 하겠다.

from django.urls import path
from diary import views

app_name='diary'
urlpatterns = [
    path('', views.index, name='index'),
    path('create/', views.create, name='create'), 
    path('<int:id>/', views.show, name='show'),
    path('<int:id>/edit', views.edit, name='edit'), #add this line
    path('<int:id>/update/', views.update, name='update'), # add this line
]

수정을 하는 것은 사실 수정을 하고 그것을 update를 하고, 두 가지가 동시에 필요하기 때문에 두 가지 url을 만들어주었고 각각이 views.edit과 views.update를 부르고 있으니 views.py에 두 함수를 만들어주도록 하자

 

def edit(request, id):
    post = Post.objects.get(id=id)
    return render(request, 'diary/edit.html', {'post':post})

def update(request, id):
    title =request.POST.get('title')
    content =request.POST.get('content')
    satisfaction=request.POST.get('satisfaction')
    Post.objects.filter(id=id).update(title=title, satisfaction=satisfaction, content=content)
    return redirect(f'/post/{id}/')

edit은 단순히 객체를 받아와서 edit.html 페이지로 render하면 되는 것이고 update는 request의 POST에서 업데이트할 title, content, satisfaction을 가져와서 이를 udpate해주는 것이다. 그런 다음에 다시 해당 일기 내용을 보여주는 링크로 redirect 시켜준다. 


이제 마지막으로 templates에서 edit.html만 만들어주면 된다. update 하는 과정에서는 html을 render하지 않으므로 update.html은 필요 없다. 

templates/diary/에 edit.html을 생성해준다.

<body>
    <h1>Edit diary</h1>
    <form action="/post/{{ post.id }}/update/", method="POST">
        {% csrf_token %}
        <h3>title</h3>
        <input type="text" name="title" value="{{ post.title }}" />
        <p>satisfaction</p>
        <input type="text" name="satisfaction" value="{{ post.satisfaction }}" />
        <p>content</p>
        <textarea type="text" name="content" rows="30" cols="40">{{ post.content }}</textarea><br/>
        <input type="submit" value="submit"/>
    </form>
</body>

이런식으로 써주고

 

python manage.py runserver

를 해보면 수정이 아주 잘 되는 것을 알 수 있다.

 

다음 포스팅에서는 CRUD 중 마지막 Delete하는 법에 대해서 알아보도록 하겠다.