1. Update
이번에는 글을 수정하는 update 기능을 구현해 볼 것이다. Create와 마찬가지이다.
1. update.html을 만들고 crud2/urls.py와 blog/views.py에 연결한다.
2. update를 위해서는 어떤 정보가 필요할까? 바로, 그 수정될 글의 id와 수정하기 전 내용이다. 이전에 detail 페이지를 만들 때 <int:id>의 형태로 path converter를 사용했다. 우선 detail.html에서 update로 갈 수 있게끔 수정해준다.
<div class="container">
<h1>{{ blog.title }}</h1>
<p>{{ blog.pub_date }}</p>
<p>{{ blog.body }}</p>
<a href="{% url 'update' blog.id %}">수정하기</a>
<a href="{% url 'home' %}">돌아가기</a>
</div>
3. urls.py에 update에 관한 내용을 추가해준다.
path('update/<int:id>', update, name='update')
4. views.py에서 urls.py에서 넘겨준 id를 받아 해당 글을 가져온다.
def update(request, id):
blog = Blog.objects.get(id=id)
return render(request, 'update.html', {"blog": blog})
5. update.html로 가서 받아온 내용을 집어넣는다. (form action을 이용해서)
<form action="{% url 'update' blog.id %}" method="POST">
{% csrf_token %}
<h4>제목:</h4>
<input type="text" name="title" value="“{{blog.title}}”" />
<br />
<br />
<h4>본문:</h4>
<textarea name="body" cols="30" rows="10">{{blog.body}}</textarea><br /><br />
<input type="submit" value="완료" />
</form>
6. views.py를 다음과 같이 업데이트해준다.
def update(request, id):
blog = Blog.objects.get(id=id)
if request.method == 'POST':
blog.title = request.POST['title']
blog.body = reqeust.POST['body']
blog.save()
return redirect('detil', blog.id)
return render(request, 'update.html', {"blog": blog})
요청 메소드가 POST라면 title과 body를 업데이트해주고 저장한다는 뜻이다. detail에서 수정하기 버튼을 눌렀을 때는, 요청 메소드가 POST가 아니라 GET이기 때문에 그냥 제일 아랫줄이 실행되어 update.html로 이동하게 되고, update에서 우리가 form method='POST'로 정의한 것에 따라 완료 버튼을 눌렀을 때의 요청 메소드는 POST가 되면서 글 업데이트가 진행된 뒤에 detail 페이지로 리다이렉트 되는것이다.
결과물
수정하기 버튼을 누르면 저렇게 수정 페이지로 이동을 하고, 완료 버튼을 누르면 POST 메소드에 따라 값이 수정된 채로 저장이 된다.
2. Delete
delete가 제일 쉽다.
1. 먼저 delete 함수를 views.py에 정의해준다.
def delete(request, id):
blog = Blog.objects.get(id=id)
blog.delete()
return redirect('home')
마찬가지로 삭제할 id를 받아온 뒤 delete만 해주고, 이제 그 detail 페이지가 사라졌으므로 home으로 리다이렉트 하면된다.
2. update와 마찬가지로, 삭제할 id가 필요하기때문에 urls.py에 위와같이 설정해준다.
path('delete/<int:id>', delete, name='delete')
3. detail.html에서 delete url과 연결되는 링크를 넣어준다.
<a href="{% url 'delete' blog.id%}">삭제하기</a>
결과물
삭제하기를 누르면 사라지고 home으로 리다이렉트 되는것을 알 수 있다.
'Django' 카테고리의 다른 글
[Django] Template 상속, 앱 분리, Static (0) | 2021.07.22 |
---|---|
[Django] CRUD - R, C (0) | 2021.07.21 |
[Django] Model & Admin (2) | 2021.07.21 |