수학과의 좌충우돌 프로그래밍

[Django] 17. 글 삭제 및 수정 구현하기 본문

웹프로그래밍/Django

[Django] 17. 글 삭제 및 수정 구현하기

ssung.k 2019. 3. 24. 05:04

글 삭제 및 수정

교내 주인 없는 고양이들을 관리해줄 수 있는 사이트를 제작중이다. 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})

 

Comments