Django 07 - CRUD 4 (Delete, Update)
27 Apr 2019 | DjangoModel을 활용한 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.title
와post.content
를 value 속성의 값으로 저장. - 이를 통해 edit.html이 실행될 때, input 태그의 value에 기존의 데이터를 볼 수 있게됨.
- 어떠한 레코드를 수정하는지에 대한 정보가 들어가야하므로,
post.pk
변수는variable routing
으로 사용하여, update주소로 요청을 보냄. - 요청방식은
POST
가 사용되었기 때문에, 추가로csrf_token
을 입력.
- input 태그의 내용에는 변경사항을 실어서
<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 routing
인post_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