4. 실전 프로젝트 - 북마크 - 2

2019. 6. 4. 18:20파이썬 웹프로그래밍

4.4. 관리자 페이지에 모델 등록

모델을 이용한 데이터 작업을 하려면 해당 뷰를 만들어야 합니다. 하지만 뷰를 만들기 위해서는 시간이 걸립니다. 또 뷰를 만들면서 확인하는 작업을 할 때 미리 입력된 데이터가 핅요하기도 합니다. 그래서 관리자 페이지에 미리 모델을 관리할 수 있도록 등록해두면 편리합니다.

admin.py에 다음 코드를 입력합니다.

from django.contrib import admin
from .models import Bookmark

admin.site.register(Bookmark)

admin.py는 모델을 관리자 페이지에 등록해 관리할 수 있도록 하는 역할과 관리자 페이지에서 보이는 내용의 변경, 기능 추가 등을 ㄱ할 수 있도록 코드를 입력하는 파일입니다.

from .models import Bookmark 구문은 현재 폴더에 있는 models.py파일에서 Bookmark라는 모델을 불러오겠다 라는 의미입니다. 이렇게 불러온 모델을 admin.site.register 구문을 이용해 등록하면 관리자 페이지에서 해당 모델을 관리할 수 있습니다.

python manage.py runserver

명령을 입력해 서버를 실행하고 관리자 페이지에 접속해 모델이 나타나는지 확인해 봅시다.

모델 등록 후 관리자 화면

관리자 화면에 Bookmark 모델이 보인다면 [Add] 버튼을 클릭해 몇가지 북마크를 추가합니다. 추가 화면으로 이동하면 사이트 이름과 주소를 입력하고 [SAVE] 버튼을 클릭합니다.

북마크 추가 화면

이렇게 몇 번의 과정을 반복하면서 북마크를 추가합니다. 추가 한 후 목록 화면을 보면 추가한 북마크가 나타나는 것 같습니다. 그런데 어떤 사이트인지 알아볼 수가 없습니다. 목록에 보면 우리가 알아볼 수 있는 내용은 없고 북마크 모델의 오브젝트라는 내용과 번호만 출력되고 있습니다.

북마크 추가 후 목록

이런 현상을 수정해 목록을 알아볼 수 있도록 만들려면 모델을 수정해야만 합니다.

 

4.5. 모델에 __str__ 메서드 추가

클래스 내부에 있는 메서드 중에서 _(언더바)가 앞뒤로 두 개씩 붙어있는 함수들을 매직 메서드 혹은 던더 메서드라고 브릅니다. 특별한 기능들이 있는 메서드들인데 이번에 추가할 __str__메서드도 매직 메서드입니다. 이 메서드의 기능은 클래스의 오브젝트를 출력할 때 나타날 내용을 결정하는 메서드입니다.

models.py

from django.db import models

class Bookmark(models.Model):
    #...
    def __str__(self):
        # 객체를 출력할 때 나나탈 값
        return "이름: "+self.site_name + ", 주소: " + self.url

__str__ 메서드는 항상 문자열을 반환해야 합니다. 안에서 어떤 연산을 수행해도 상관없지만 반환하는 값은 항상 문자열이 되도록 구문을 만들어 줍니다. 코드를 변경했다면 관리자 페이지로 이동해 북마크 모델의 목록을 새로고침 합니다.

__str__ 메서드 추가 후 목록 화면

변경된 목록을 보면 __str__ 메서드에서 반환한 값이 출력되고 있는 것을 알 수 있습니다. 이 메서드의 내용은 이후에 삭제 화면에서도 동일하게 나타납니다.

 

4.6. 목록 뷰 만들기

관리자 페이지를 이용해 모델을 관리할 수 있지만 제대로된 서비스를 만들기 위해서는 프론트에서 해당 기능을 사용할 수 있어야 합니다. 이러한 기능들을 뷰(view)라고 부르는데 보통은 views.py에 만듭니다.

첫 번재로 만들 뷰는 목록 뷰입니다. views.py 파일을 열고 BookmarkListView를 만듭니다.

from django.views.generic.list import ListView
from .models import Bookmark

class BookmarkListView(ListView):
    model=Bookmark

이번 앱에서는 모든 뷰를 클래스형 뷰로 만들 것입니다. 뷰에는 함수형 뷰와 클래스형 뷰가 있다는 것을 기억하셔야 합니다. 클래스 형 뷰는 웹 프로그래밍에서 자주 사용하는 기능을 장고가 미리 준비해 뒀고 그걸 빌려다 쓰는 형태라고 말씀 드렸습니다. 북마크 앱은 전형적인 뷰들이 필요하기 때문에 클래스형 뷰가 적절합니다.

목록 뷰는 BookmarkListView라는 이름으로 클래스형 뷰를 만드는데, ListView를 상속해 사용합니다. 그리고 model을 설정해줘야 하기 때문에 Bookmark 모델을 임포트 하고 클래스 안에 model=Bookmark라는 구문을 이용해 모델을 설정합니다.

 

4.7. URL 연결하기

뷰를 만들었으면 어떤 주소를 사용해 이 뷰를 호출할 수 있도록 연결해야 합니다. 다시 말하면 어떤 주소를 입력했을 때 해당 페이지를 보여주고 싶은가를 설정하는 것입니다. 이 설정은 urls.py 파일에 합니다.

urls.py 파일은 config 폴더에 있는 루트 파일과 각 앱 폴더에 만들어 두는 서브 파일들이 있습니다. 루트 urls.py 파일만 있어도 무방하지만 한번 만든 앱은 다른 프로젝트에도 재사용할 수 있기 때문에 앱에 관한 URL 연결은 앱 폴더에 있는 urls.py에 설정합니다.

그리고 앱에 관한 urls.py의 내용은 루트 파일에서 연결해줘야만 동작을 합니다. 루트 urls.py 파일을 열고 include 함수를 임포트 하고 urlpatterns에 bookmark.urls를 연결하는 path를 추가합니다.

config/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns=[
    path('bookmark/', include('bookmark.urls')),
    path('admin/', admin.site.urls),
]

이렇게 연결을 하면 http://127.0.0.1:8000/bookmark/[이하 URL] 같은 주소로 접속하면 bookmark/까지의 URL을 잘라내고 나머지 부분을 bookmark.urls.로 전달해 찾아봅니다. 나머지 부분을 가지고 어떤 뷰를 연결할지를 bookmark앱 폴더에 있는 urls.py에 작성하도록 합시다. 아직까지는 bookmark 앱 폴더에 urls.py가 없으므로 새로 파일을 만들어 줍니다.

bookmark/urls.py

from django.urls import path
from .views import BookmarkListView

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

path의 첫 번째 인수의 ''를 보면 bookmark/이하 부분이 없다라고 해석할 수 있습니다. 그럼 북마크 앱의 루트 페이지 같은 역할을 한다고 생각하면 됩니다. 이런 주소로 접속했을 때 BookmarkListView라는 뷰를 호출하겠다라는 의미입니다. 함수형 뷰라면 뷰 이름만 써주면 되지만 클래스형 뷰일 경우 뒤에 .as_view()라고 꼭 붙여줘야 정상적으로 동작합니다. 마지막 인자인 name은 설정한 이름을 가지고 해당 URL패턴을 찾을 수 있도록 하는 역할을 합니다.

URL과 뷰를 연결했으니 이제 서버를 실행해서 확인해 보겠습니다.

python manage.py runserver

서버를 실행하면 템플릿 파일이 없다는 오류 메시지가 나타납니다.

TemplateDoesNotExist 오류 메시지

템플릿 파일을 만들어 오류를 없애 봅시다.

 

4.8. bookmark_list.html

템플릿 만들기템플릿은 프론트 엔드 소스코드가 저장되는 파일들이면서 장고에서 데이터를 껴 넣는 양식 파일이기도 합니다. 어떤 뷰를 만들 때는 그 뷰의 내용을 어떻게 브라우저에 표시할지 템플릿을 가지고 결정합니다.

또 템플릿 파일은 정해진 위치가 있습니다. 앱 폴더 내부에 templates 폴더에 위치해야 하며 보통 앱 이름으로 폴더를 한번 더 만들어 저장합니다. templates/bookmark 폴더를 만들고 해당 폴더를 마우스 오른쪽 버튼으로 클릭해 [New-> HTML File] 메뉴를 선택합니다.

만들 HTML 파일의 body 태그 안에 다음의 코드를 입력합니다.

<div  class="btn-group">
    <a href="#" class="btn btn-info">Add Bookmark</a>
</div>
<p></p>
<table class="table">
    <thead>
        <tr>
            <th scope="col">#</th>
            <th scope="col">Site</th>
            <th scope="col">URL</th>
            <th scope="col">Modify</th>
            <th scope="col">Delete</th>
        </tr>
    </thead>
    <tbody>
        {% for bookmark in object_list %}
            <tr>
                <td>{{forloop.counter}}</td>
                <td><a href="#">{{bookmark.site_name}}</a></td>
                <td><a href="{{bookmark.url}}" target="_blank">{{bookmark.url}}</a></td>
                <td><a href="#" class="btn btn-success btn-sm">Modify</a></td>
                <td><a href="#" class="btn btn-danger btn-sm">Delete</a></td>
            </tr>
        {% endfor %}
    </tbody>
</table>
                

소스 코드 첫 부분에는 북마크 추가하기 링크를 만들어 두었고, 그 다음부터 북마크의 목록을 출력하기 위해서 table 태그를 사용합니다. 제레닉 뷰에서는 모델의 오브젝트가 여러개일 경우 object_list라는 변수로 전달합니다. 이 object_list에서 bookmark라는 이름으로 북마크를 하나씩 꺼내 북마크 당 한줄씩 출력할 것입니다. 한 북마크는 tr 태그로 묶습니다. 각각의 북마크를 출력할 때 사이트 이름 url 등을 출력하고 수정 버튼과 지우기 버튼도 함께 만들어 두겠습니다.

HTML 파일을 새로 만들었으니 서버를 다시 실행하고 결과를 확인합니다.

템플릿을 사용한 후 목록

목록이 잘 출력된다면 추가, 상세, 수정, 삭제 기능을 구현하도록 하겠습니다.