일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- django ORM
- 백준
- Django
- AWS
- API
- DRF
- django rest framework
- c++
- java
- 장고
- 알고리즘 연습
- 파이썬 알고리즘
- HTML
- Algorithm
- django widget
- web
- js
- Baekjoon
- javascript
- 알고리즘 풀이
- 알고리즘 문제
- CSS
- Git
- form
- MAC
- es6
- 파이썬
- react
- PYTHON
- 알고리즘
- Today
- Total
수학과의 좌충우돌 프로그래밍
[Django] 17. 글 삭제 및 수정 구현하기 본문
글 삭제 및 수정
교내 주인 없는 고양이들을 관리해줄 수 있는 사이트를 제작중이다. home.html
에 접속하면 여러 고양이들의 존재하고 각 고양이를 클릭하면 localhost:8000/detail/<cat_id>
로 이동하여 detail.html
에서 상세 정보를 확인할 수 있다. 이 상황에서 고양이가 학교를 떠나서 고양이 정보를 담은 글을 삭제하거나 정보를 수정해야할 때, 어떻게 해야하는지 알아보자.
[ 글삭제 ]
먼저 글을 삭제하는 기능을 구현해보자. 각 고양이를 클릭하면 detail.html
으로 이동하므로 이 안에 삭제 버튼을 넣어주자.
detail.html
외적은 부분은 신경쓰지않고 단순하게 텍스트로 넣어주었다. a 태그
는 delete
라는 url 을 가진 주소로 이동하며 cat.id
를 넘겨준다. cat.id 는 해당 페이지 고양이의 아이디가 된다.
<div class="delete">
<p><a href="{% url 'delete' cat.id %}">삭제</a></p>
</div>
urls.py
위에서 만들어준 delete
라는 이름을 가진 url을 만들어줘야한다. 현재 detail 페이지의 url 인 localhost:8000/detail/<cat_id>
뒤에 delete 를 추가하여 localhost:8000/detail/<cat_id>/delete
로 만들어주었다. 또한 이 url로 이동 시, views에 delete 라는 함수를 실행한다.
urlpatterns = [
path('',postapp.views.home, name='home'),
path('detail/<int:cat_id>',postapp.views.detail, name='detail'),
path('detail/<int:cat_id>/delete',name='delete'),
]
views.py
urls.py 에 따라localhost:8000/detail/<cat_id>/delete
로 접근 시 delete
라는 함수가 실행이 된다. 그리고 그 함수에서 해당 고양이 글을 삭제하는 역할을 담당한다. 모든 함수가 그렇듯 파라미터로 request 를 받고, detail.html 을 확인해보면 cat.id
를 같이 받아온다. 받아온 id 를 통해서 해당 고양이를 찾고 그 고양이를 삭제한다. 삭제한 후에는 redirect
를 통해서 localhost:8000
, home 으로 이동한다.
def delete(request, cat_id):
cat = Cat.objects.get(id=cat_id)
cat.delete()
return redirect('/')
[ 글수정 ]
detail.html
글 삭제와 마찬가지로 간단하게 수정이라는 텍스트로 수정버튼을 대신 했다. a 태그
를 통해 edit
라는 url을 가진 주소로 이동하며 cat.id
를 넘겨준다. cat.id 는 해당 고양이의 아이디이다.
<div class="edit">
<p><a href="{% url 'edit' cat.id %}">수정</a></p>
</div>
edit_post.html
edit_post는 글을 수정하는 페이지 입니다. form
를 이용해 입력하는 input 창을 만들어주고 POST 방식으로 값을 전달합니다.
{% extends "postapp/base.html" %}
{% block content %}
<div class="container">
<h1>수정 페이지</h1>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<table>
{{form.as_table}}
</table>
<br>
<button type="submit" class="btn btn-primary">제출하기</button>
</form>
</div>
{% endblock %}
urls.py
삭제기능을 구현했던 url 가 같은 논리입니다. 단지 뒤에 delete 대신 edit이 붙고 views 에 edit
함수를 실행시켜주고 이름을 edit
으로 지정해주었습니다.
urlpatterns = [
path('',postapp.views.home, name='home'),
path('detail/<int:cat_id>',postapp.views.detail, name='detail'),
path('detail/<int:cat_id>/delete',name='delete'),
path('detail/<int:cat_id>/edit', postapp.views.edit, name='edit'),
]
views.py
urls.py 에 따라localhost:8000/detail/<cat_id>/edit
로 접근 시 edit
라는 함수가 실행이 된다. 그리고 그 함수에서 해당 고양이 글을 수정하는 역할을 담당한다. 파라미터로 request 를 받고, detail.html 을 확인해보면 cat.id
를 같이 받아온다. 받아온 id 를 통해서 해당 고양이를 찾고 그 고양이의 정보를 수정한다.
요청이POST
로 들어오지 않았을 경우에는 위에서 만들었던 edit_post.html
로 이동하고 수정한 후, 제출하기
를 누르면 POST
로 들어와 글을 수정하게 된다. 글을 수정하는 원리는 값을 받아온 form
이 제대로 값이 들어온지 is_vaild
유효성을 검사하고 cleaned_data
를 통해서 고양이의 정보를 수정해준다. cleaned_data
는 값들을 사전 타입으로 제공한다. 그렇기 key 값으로 데이터를 불러올 수 있다. 값을 저장한 뒤에는 redirect
를 통해 고양이의 detail 페이지로 이동한다.
def edit(request, cat_id):
cat = Cat.objects.get(id=cat_id)
# 글을 수정사항을 입력하고 제출을 눌렀을 때
if request.method == "POST":
form = CatPost(request.POST, request.FILES)
if form.is_valid():
print(form.cleaned_data)
# {'name': '수정된 이름', 'image': <InMemoryUploadedFile: Birman_43.jpg (image/jpeg)>, 'gender': 'female', 'body': '수정된 내용'}
cat.name = form.cleaned_data['name']
cat.image = form.cleaned_data['image']
cat.gender = form.cleaned_data['gender']
cat.body = form.cleaned_data['body']
cat.save()
return redirect('/detail/'+str(cat.pk))
# 수정사항을 입력하기 위해 페이지에 처음 접속했을 때
else:
form = CatPost()
return render(request, 'postapp/edit_post.html',{'form':form})
'웹프로그래밍 > Django' 카테고리의 다른 글
[Django]투표 기능 구현하기 (0) | 2019.04.06 |
---|---|
[django] 글 수정 시 기존의 내용 불러오기 (0) | 2019.04.04 |
[Django] 많이들 하는 실수, html 파일의 위치 (0) | 2019.03.11 |
[Django] requirements.txt 를 통한 패키지 종속성 관리 (0) | 2019.03.06 |
[Django] 16. postgreSQL 사용하기! (0) | 2019.03.05 |