날로 먹는 Django 웹 프로그래밍 강좌
Django 1.0에서 Admin 기능 쓰기 – 부록편
안녕하세요, 한날입니다.
오랜만에 Django 강좌 글로 뵙습니다.
지난 2008년 8월에 강좌 연재를 마친 뒤 얼마 후에 Django 1.0판이 새로 나왔습니다. 꽤 많은 점이 바뀌었더군요. 대체로 이전 정식판인 0.96를 기준으로 개발한 코드라도 잘 작동하는데, 일부 기능은 아예 작동하지 않기도 합니다.
이 연재글은 “날로 먹는 Django 웹 프로그래밍 강좌” 을 보완하여 현재 정식으로 배포되고 있는 Django 1.0판에서 제대로 작동시키는 내용을 담습니다. 또, 본 강좌에서 다루지 않은 내용 일부를 추가하려 합니다. 즉, 새 강좌 연재는 아니고, 부록에 해당하는 것이지요.
그럼 바로 시작하겠습니다.
Admin 영역 사용법 변화
admin.py 만들기
“청) 컨트롤러(뷰) – 글 목록과 글 보기 기능 (5편 1/3)”에서 Django의 Admin 영역/기능을 다룹니다. 그런데 1.0판부터 Admin 기능을 쓰는 방법이 크게 바뀌었습니다.
기존에는 각 모델마다 Admin 이라는 클래스를 만들어서 썼습니다.
class Entries(models.Model): Title = models.CharField(max_length=80, null=False) class Admin: pass
이런 식이죠. 하지만, 1.0판부터는 admin.py파일을 따로 만들어야 합니다.참고1)
이 파일은 각 어플리케이션마다 씁니다. 본 강좌에서 우리는 blog 라는 어플리케이션을 만들었는데(manage.py startapp blog), 이 어플리케이션 안에, 그러니까 어플리케이션 디렉토리(폴더) 안에 admin.py 파일을 만들면 됩니다.
admin.py 파일을 만든 뒤 관련 모듈을 가져오겠습니다.
from django.contrib import admin
이 admin 모듈을 써서 Django admin 영역에서 다룰 모델을 등록할 수 있습니다. 바로 admin.site 에 있는 register 메서드, 즉 admin.site.register 로 하는 것이지요.
먼저 Admin 영역에서 다룰 모델을 가져옵니다. 편의상 Entries 를 해보겠습니다.
from hannal.blog.models import Entries
from 경로는 여러분이 어떻게 프로젝트를 만들고 어플리케이션 이름을 지었는지에 따라 다릅니다.
이렇게 가져온 모델을 admin.site.register 로 등록합니다.
admin.site.register(Entries)
이렇게 하면 Django admin 영역에서 Entries 모델을 다룰 수 있습니다.
Admin 영역에서 좀 더 예쁘게 하기
Django admin 영역에서 다룰 모델을 등록하는 것 말고도 화면에 나타나는 영역을 바꿀 수 있습니다. 본 강좌에서는 “admin 영역에서 자료 좀 더 예쁘게 나타내기”라는 단락에 나와있지요. 이 부분도 Django 1.0판에서 조금 바뀌었습니다. Entries 모델을 기준으로 예를 들어서, 우리는 글 번호와 제목, 작성일시만 뜨게 해보겠습니다.
admin.site.register 위에 아래와 같이 클래스를 하나 만듭니다.
class EntriesAdmin(admin.ModelAdmin): pass
이 클래스는 Admin 영역에서 Entries 모델을 어떻게 출력하고 다루게 할 것인지에 대한 정보를 담는 역할을 합니다. 자세한 내용은 잠시 뒤에 하기로 하고 우선 pass 로 빈 클래스를 만듭니다.
이 클래스를 방금 admin.site.register 로 Entries 모델을 등록하는 부분에 추가합니다.
admin.site.register(Entries, EntriesAdmin)
이렇게 register 메서드에 두 번째 인자로 넣는 겁니다.
이제 글 번호, 제목, 작성일시가 뜨게 해보겠습니다. 간단합니다. EntriesAdmin 클래스에 아래 내용을 써넣습니다.
list_display = (‘id’, ‘Title’,'created’,)
list_display 라는 클래스 프로퍼티에 튜플 자료형으로 출력할 모델 요소를 문자열로 담는 겁니다. 기존 방법과 같습니다.
class EntriesAdmin(admin.ModelAdmin): list_display = ('id', 'Title','created',)
코드는 이렇게 생겼습니다.
이외에도 좀 더 다양한 변화를 줄 수 있습니다. 자세한 내용은 공식 문서(The Django admin site)를 참조하시길 바랍니다.
urls.py 내용 바꾸기
이걸로 끝이면 좋겠는데, urls.py 에서 Admin 영역에 접근하는 방법도 바뀌었습니다.
먼저 urls.py 맨 위에다가
from django.contrib import admin admin.autodiscover()
를 넣습니다. 그런 뒤 주소 체계는 아래와 같이 넣으면 됩니다.
(r'^admin/(.*)', admin.site.root),
Django 1.0판에서 프로젝트를 만들면(django-admin.py startproject hannal) 이러한 내용은 이미 반영되어 있으니 크게 어렵진 않을 겁니다.

스파이크 님,
2009년 02월 2일 02시 02분 26초
좋은 글 잘 읽었습니다. 대신 애매한 부분이 있네요.
Admin 인터페이스에 모듈을 추가하기 위해서 반드시 admin 파일을 새로 만들 필요는 없습니다. 중요한 변화는 Admin이라는 메타 클래스를 모델 클래스 안에 정의해주는 방식에서 site.register로 등록만 해주면 되는, 좀더 유연한 방식으로 변화했다는 점입니다. 그래서 이 site.register는 models.py 안에서 처리해줘도 무방합니다. 좀더깊이 들어가서 django.db.models.get_models가 읽어들이는 다른 모듈 어디에서든 지정할 수 있습니다.
참고하시길 바랍니다.
Hannal 님,
2009년 02월 2일 10시 02분 01초
아아, 그렇군요! models.py 에서 한다면 더 편하게 모델을 등록할 수 있어 편리할 것 같습니다. 굳이 models.py 를 참조하며 admin.py 를 고치지 않아도 되니 직관성도 좋을 것 같습니다. Admin 기능 쓰는 방법이 admin.py 을 쓰는 형태로 바뀌어서 내심 불만이 있었는데, 스파이크님 덕에 좋은 가르침 받았습니다.
.
이 글에도 스파이크님 말씀을 참조할 수 있게 참조를 걸어두었습니다. 고맙습니다.