Old Branch

장고(Django) 예제 / 북마크 프로젝트 - 3 . CRUD추가

woolbro 2019. 7. 24. 11:10
반응형

우리는 이전 포스팅까지 개발 환경을 세팅하고 장고의 뷰와 url을 작성하였습니다.

아래의 더보기를 누르시면, 이전 포스팅이 나옵니다.

...더보기

 

이번 포스팅에서는 데이터의 추가, 수정, 삭제를 구현(CRUD)하도록 하겠습니다!

이번 포스팅의 소스코드도, Github 저장소에있습니다.

 

 

CRUD?

CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다. 사용자 인터페이스가 갖추어야 할 기능(정보의 참조/검색/갱신)을 가리키는 용어로서도 사용된다.

CRUD 대신에 다음과 같은 유사용어가 사용되기도 한다.

  • ABCD: add(추가), browse(보기), change(변경), delete(삭제)
  • ACID: add(추가), change(변경), inquire(질의), delete(삭제)
  • BREAD: browse(보기), read(읽기), edit(편집), add(추가), delete(삭제)
  • VADE(R): view(참조), add(추가), delete(삭제), edit(편집), 트랜잭션 처리에서는 restore(복원) 추가

출처 - 위키백과, 우리 모두의 백과사전

 

 

기본적으로 지난 소스코드를 잘 작성하였다면, 이어서 CRUD를 그 위에 작성 해 보도록 하겠습니다

북마크 추가(Create) 기능

 

북마크 추가를 위한 뷰를 BookmarkCreateView라는 이름의 클래스 뷰로 만들었습니다.

CreateView를 상속받아 쉽게 만들 수 있습니다. 

bookmark/views.py BookmarkCreateView를 추가 해 주 도록 하겠습니다.

from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
# Create your views here.

from .models import Bookmark

class BookmarkListView(ListView):
    model = Bookmark

##Create Bookmark 메서드 추가
class BookmarkCreateView(CreateView):
    model = Bookmark
    fields = ['site_name','url']
    success_url = reverse_lazy('list')
    template_name_suffix = '_create'

BookmarCreateView에서, 어떤 모델을 입력 받을 것인지 결정 해야 하기 때문에  model = Bookmark 로 설정합니다.

fields는 어떤 필드를 입력 받을 것인지 설정하는 부분입니다.

success_url은 글쓰기를 완료하고 이동할 페이지 입니다.

 

뷰를 완성 했으니, url을 연결 해 주도록 하겠습니다.

 

bookmark/urls.py

from django.urls import path
from .views import BookmarkListView, BookmarkCreateView

urlpatterns = [
    path('', BookmarkListView.as_view(), name='list'),
    path('add/',BookmarkCreateView.as_view(),name='add'),
]

 

방금 작성한 BookmarkCreateView를 추가 해 주고, 해당하는 뷰의 url을 'add/'로 설정 해 줍니다.

해당하는 템플릿도 바로 등록 하도록 하겠습니다.

 

bookmark/templates/bookmark/bookmark_create.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>woolbro bookmark</title>
</head>
<body>
    <form action = "" method = "post">
        {% csrf_token %}
        {{form.as_p}}
        <input type = "submit" value="Add" class = "btn btn-info btn-sm">
    </form>
</body>
</html>

form태그의 action 메서드는 자료를 전달할 대상 페이지 입니다. 작성하지 않고 비워둘 경우 현재 페이지로 전달합니다.

form.as_p는 클래스형 뷰의 옵션 값으로 설정한 필드를 출력하는데 각 필드 폼 태그들을 P 태그로 감싸 출력하는 코드입니다.

 

기능 작성이 완료 되었으니 서버를 실행시켜서 확인 해 보도록 하겠습니다.

 

$ python manage.py runserver

 

 

 

추가 기능이 잘 동작하는 것을 확인 할 수 있습니다.

 

 

북마크 상세 페이지 기능 구현

 

이번에는 북마크 상세 페이지 기능을 구현 해 보도록 하겠습니다.

 

마찬가지로 bookmark/views.py에 뷰를 작성 해 주고, url을 연결 해 주는 작업을 하도록 하겠습니다.


bookmark/veiws.py에 아래의 코드를 추가 해 주세요.

from django.views.generic.detail import DetailView

from .models import Bookmark

##View Detail Bookmark 메서드 추가
class BookmarkDetailView(DetailView):
    model = Bookmark

 

bookmark/urls.py에 path를 추가했습니다.

from django.urls import path
from .views import BookmarkListView, BookmarkCreateView, BookmarkDetailView

urlpatterns = [
    path('', BookmarkListView.as_view(), name='list'),
    path('add/',BookmarkCreateView.as_view(),name='add'),
    path('detail/<int:pk>/',BookmarkDetailView.as_view(),name='deatail')
]

 

이번에 추가한 URL 패턴은 다른 뷰들과는 차이가 있습니다. 바로 <int:pk> 인데요

앞쪽의 int 는 타입이라고 생각 하면 되고, 뒤쪽의 pk는 반환받은 값 또는 패턴에 일치하는 값의 변수 명 입니다.

int 대신에 str, slug, uuid,path 등을 사용 할 수 있습니다.

 

url 연결이 끝났으니, bookmark_detail.html을 추가 해 주도록 하겠습니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>woolbro bookmark</title>
</head>
<body>
    {{object.site_name}}<br/>
    {{object.url}}
</body>
</html>

이제 리스트 페이지에서 디테일과 연결 해 주는 링크를 만들도록 하겠습니다.

 

bookmark_list.html에 있는 bookmark.site_name의 링크 <a href="#">....를 아래와 같이 수정 해 주세요

   <td><a href="{% url 'detail' pk=bookmark.id %}">{{bookmark.site_name}}</a></td>

위와같이 확인이 된다면, 성공 한 것입니다.

 

 

북마크 수정 기능 구현

수정 기능을 구현하도록 하겠습니다.

마찬가지로 bookmark내의 views.py, urls.py를 수정하고, bookmark_update.html을 추가 하도록 하겠습니다.

 

bookmark/views.py

from django.views.generic.edit import CreateView,UpdateView

##Update View Bookmark 메서드 추가
class BookmarkUpdateView(UpdateView):
    model = Bookmark
    fields = ['site_name','url']
    template_name_suffix = '_update'

 

bookmark/urls.py

from django.urls import path
from .views import BookmarkListView, BookmarkCreateView, BookmarkDetailView, BookmarkUpdateView

urlpatterns = [
    path('', BookmarkListView.as_view(), name='list'),
    path('add/', BookmarkCreateView.as_view(), name='add'),
    path('detail/<int:pk>/', BookmarkDetailView.as_view(), name='detail'),
    path('update/<int:pk>/', BookmarkUpdateView.as_view(), name='update'),
]

 

bookmark/templates/bookmark/bookmark_update.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>woolbro bookmark</title>
</head>
<body>
    <form action = "" method = "post">
        {% csrf_token %}
        {{form.as_p}}
        <input type = "submit" value="Update" class = "btn btn-info btn-sm">
    </form>
</body>
</html>

 

list페이지에 연결 또한 해야겠습니다

detail을 수정 해줬을 때 처럼, list페이지에 Modify의 <a href="#"....> 를 수정 해 주도록 하겠습니다.

 <td><a href="{% url 'update' pk=bookmark.id %}" class="btn btn-success btn-sm">Modify</a></td>

 

"Modify" 버튼을 눌렀을 때 아래와 같은 화면이 나오면 성공 한 것입니다.

마지막으로 삭제 메서드를 구현 하겠습니다.

 

북마크 삭제 기능 구현

이전의 작업들을 보셨듯이, 마찬가지로 제네릭 뷰를 상속받아 구현 할 것이구요, views.py, urls.py, 등을 작성 해 주도록 하겠습니다.

 

views.py에 아래의 코드를 추가 해 줍니다.

 

bookmark/views.py

from django.views.generic.edit import CreateView,UpdateView, DeleteView

class BookmarkDeleteView(DeleteView):
    model = Bookmark
    success_url = reverse_lazy('list')

 

urls.py에 path 도 추가 해 줍니다. (가장 마지막줄 delete)

bookmark/urls.py

from django.urls import path
from .views import BookmarkListView, BookmarkCreateView, BookmarkDetailView, BookmarkUpdateView, BookmarkDeleteView

urlpatterns = [
    path('', BookmarkListView.as_view(), name='list'),
    path('add/', BookmarkCreateView.as_view(), name='add'),
    path('detail/<int:pk>/', BookmarkDetailView.as_view(), name='detail'),
    path('update/<int:pk>/', BookmarkUpdateView.as_view(), name='update'),
    path('delete/<int:pk>/', BookmarkDeleteView.as_view(), name='delete'),
]

 

삭제 기능을 구현 했으니, 삭제 기능도 링크로 이어주도록 하겠습니다.

마찬가지로 list 페이지에 Delete 부분의 링크에 넣어주겠습니다.

<td><a href="{% url 'delete' pk=bookmark.id %}" class="btn btn-danger btn-sm">Delete</a></td>

 

이제 서버를 통해 확인 해 보도록 하겠습니다.

 

 

???????? 오류가 납니다......

위의 오류는 bookmark_confirm_delete.html을 작성 해 주지 않아서 나타나는 현상입니다.

 

template폴더에, bookmark_confirm_delete.html을 작성 해 주도록 하겠습니다.

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>woolbro bookmark</title>
</head>
<body>
    <form action = "" method = "post">
        {% csrf_token %}
        <div class="alert alert-danger">Do you want to delete "{{object}}" ???? Are you Sure?</div>
        <input type = "submit" value="Delete" class = "btn btn-info btn-sm">
    </form>
</body>
</html>

서버를 다시 실행시켜 결과를 확인 해 보면, Delete 버튼을 눌렀을때 아래와 같이 확인 페이지가 나옵니다.

 

고생하셨습니다 :)

 

다음 포스팅에서는 Bootstrap을 통해 화면을 꾸며보도록 하겠습니다!