장고 마스터하기 - 5장
필드를 선택적으로 만들기
모델 필드 중 특정 입력란을 선택사항으로 지정할 수 있다. 필드에 blank = True
를 추가하면 된다.
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True)
기본값으로 blank는 false이며, 공백을 허용하지 않는다.
admin으로 들어가 확인하면 email 필드는 볼드체가 아니다. 필수 필드가 아님을 뜻한다.
날짜 및 숫자 필드를 선택적으로 만들기
SQL에서는 공백값을 지정하기 위해 NULL을 사용한다. NULL은 SQL에서 빈 문자열과 다르다. 파이썬도 특수 객체인 None은 빈 문자열(““)과 다르다.
그래서 특정 문자 필드에 NULL과 문자열값이 같이 들어갈 수 있다. 그렇게 되면 불필요한 애매모호함과 혼동을 일으킬 수 있다. 이 문제를 해결하기 위해 장고가 자동으로 생성한 CREATE TABLE 명령에는 NOT NULL을 추가한다.
예)
CREATE TABLE "book_author" (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(40) NOT NULL,
"email" varchar(75) NOT NULL,
);
이럴 때 blank = True 로 빈 문자열을 삽입할 때 잘 작동한다. 하지만 날짜 필드는 빈 문자열을 삽입하려 하면 데이터베이스에 따라 오류를 발생시킬 수도 있다.
이 경우, 빈 값을 지정하는 유일한 방법은 NULL이다. 장고 모델에 null = True
를 필드를 추가해 NULL을 허용하도록 지정할 수 있다. 즉, 날짜 필드나 숫자 필드에 빈 값을 허용하려면 null = True
와 blank = True
를 모두 사용해야 한다.
필드 레이블 사용자 정의
관리자 웹사이트의 편집 폼에서 각 필드의 레이블은 모델 필드 이름에서 생성된다. 알고리즘은 장고가 밑줄을 공백으로 대체하고 첫 번째 문자를 대문자로 만든다.
하지만 사용자가 직접 이 레이블을 정의하고 싶을 수 있다. 그럴 때 verbose_name
을 지정하면 된다.
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, verbose_name = 'e-mail')
사용자 모델 관리 클래스
장고 관리자 웹 사이트에는 특정 모델에 대한 관리자 웹 사이트 작동 방식을 사용자 정의할 수 있는 옵션들이 있다.
변경 목록 사용자 정의
목록 웹페이지에 표시될 객체 제목을 정의할 수 있다. __str__()
를 정의하면 목록에 그 값이 나타난다.
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, verbose_name = 'e-mail')
def __str__(self):
return u'%s %s' % (self.first_name, self.last_name)
각 이름과 성이 목록에 나오게 된다.
목록 표시의 기본 동작을 개선할 수도 있다. Author 모델에 ModelAdmin 클래스를 정의하면 표시할 필드 목록을 지정할 수 있다.
테이블 튜플 정의
목록 테이블의 튜플을 정의할 수 있다.
admin.py
from django.contrib import admin
from mysite.books.models import Publisher, Author, Book
class AuthorAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'email')
admin.site.register(Publisher)
admin.site.register(Author, AuthorAdmin)
admin.site.register(Book)
- AuthorAdmin 클래스를 만들고, django.contrib.admin.ModelAdmin을 하위 클래스로 하며, 옵션 중 하나인 list_display를 지정했다. 이 옵션은 보여질 목록 테이블의 튜플을 설정할 수 있다.
- admin.site.register() 호출을 변경해 작성자 다음에 AuthorAdmin을 추가해 적용한다.
- admin.site.register() 함수의 두번째 인자로 AuthorAdmin을 넣는다. 비어 있으면 장고는 기본 admin을 적용한다.
검색 창 추가
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email')
search_fields = ('first_name', 'last_name')
이름과 성을 검색할 수 있는 창이 뜬다.
날짜 필터
list_filter
는 DateField뿐만 아니라 다른 유형의 필드도 사용할 수 있다. 이 옵션을 사용하면 필터링해 바로가기를 만들어준다.
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
장고는 날짜 필드일 경우 목록테이블 오른쪽에 목록을 오늘, 지난 7일, 이번 달 및 올해로 필터링해 바로가기를 제공한다.
다른 방법은 date_hierarchy
옵션을 사용하는 것이다.
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
이를 통해 목록 상단에 날짜 드릴 다운 탐색 모음이 나타난다.
date_hierarchy
는 하나의 날짜 필드만 사용해 계층을 만들 수 있기 때문에 튜플이 아닌 문자열을 입력한다.
기본 정렬 변경
기본적으로 변경 목록은 모델의 Meta 클래스 내에서 모델 순서에 따라 객체를 정렬한다. Admin에서도 순서값을 설정할 수 있다.
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
정렬을 원하는 필드 값을 넣으면 오름차순으로 정렬된다. 내림차순은 앞에 -
를 붙여 설정한다.
편집 양식 사용자 정의
변경목록처럼, 편집 양식도 바꿀 수 있다. 기본적으로 필드 순서는 모델에서 정의한 순서로 생긴다. ModelAdmin 하위 클래스의 fields 옵션으로 바꿀 수 있다.
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
fields = ('title', 'authors', 'publisher', 'publication_date')
필드를 완전히 사용하고 싶지 않다면 튜플에서 제거하기만 하면된다.
불완전한 양식으로 새 객체를 생성하면 장고는 해당 필드를 None으로 설정하므로 필드에 null = True
를 설정해주어야한다.
다대다 필드
필드에서 여러 값을 입력하고 싶을 때 ManyToManyField를 사용하면 다중 선택 박스가 나타나 여러 개를 선택할 수는 있다. 하지만 값이 수백개라면 다루기 힘들 것이다.
그를 위해 장고에서 filter_horizontal
을 제공한다.
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
filter_horizontal = ('author',)
author 필드를 자바스크림트 필터 인터페이스로 데이터를 옮겨 놓을 수 있다.
filter_vertical
도 제공한다. 두 박스가 세로로 쌓여져 있는 인터페이스이다.
filter_vertical
과 filter_horizontal
는 Foreignkey 필드가 아닌 ManyToManyField 필드에서만 작동한다.
ID 필드
데이터가 수천 개가 있다면 select box로 열었을 때 로드하는데 시간이 걸릴 수 있다.
이를 위해 raw_id_fields
옵션을 사용할 수 있다.
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
filter_horizontal = ('author',)
raw_id_fields = ('publisher',)
이 입력란에는 데이터베이스의 ID값을 입력하면 된다. 보통은 기억하고 있지 않기 때문에 돋보기를 눌러 팝업 창으로 선택할 수 있다.
사용자, 그룹 및 사용 권한
슈퍼 유저로 로그인하면 모든 객체에 접근할 수 있다. 하지만 다른 환경에서는 다른 권한이 필요할 것이다.
사용자 객체에는 관리자 인터페이스에서 사용자가 수행할 수 있는 작업을 정의하는 필드들과 표준 사용자 이름, 비밀번호, 전자 메일 및 실제 이름 필드가 있다.
작업을 정의하는 필드로 3가지 부울 플래그 집합이 있다.
- 활성 플래그 : 사용자 활성 상태 여부 - 꺼지면 로그인도 할 수 없다.
- 스태프 플래그 : 사용자가 관리 인터페이스에 로그인할 수 있는지 여부를 결정한다. 일반 사용자와 관리자를 구분할 때 사용한다.
- 슈퍼 유저 플래그 : 사용자에게 관리자 인터페이스에서 항목을 추가, 작성, 삭제같은 접근을 할 수 있는 권한을 결정한다. 이 플래그가 켜지면 모든 일반 사용 권한이 무시된다.
일반 관리자는 할당된 권한을 통해 접근할 수 있다. 각 객체에 작성, 편집, 삭제 세가지 권한이 있다. 각 권한들 중 몇가지만 부여 받을 수도 있다.
또한 사용자들을 묶어 그룹으로 만들 수도 있다. 그런 기능은 장고 문서에서 다룬다.
관리 인터페이스를 사용하는 시점과 이유 및 사용하지 않는 시점
관리 인터페이스를 언제 어떻게 써야할까.
관리 사이트는 기술에 대해 아무것도 모르는 일반인이 데이터를 입력해야할 때 유용하다. 장고가 처음 개발된 신문사에서 업무 과정은 이렇다.
- 프로젝트 담당 기자가 개발자 중 1명을 만나 데이터를 설명한다.
- 개발자는 이 데이터에 맞게 장고 모델을 설계한 후 관리자 웹 사이트를 기자에게 보여준다.
- 기자는 점검해 누락된 필드나 외부 필드를 지적하고, 개발자가 수정한다.
- 모델이 합의되면 기자가 관리자 웹 사이트를 사용해 데이터를 입력한다. 동시에 개발자는 공개할 템플릿을 개발할 수 있다.
즉 관리 인터페이스는 콘텐츠 제작자와 개발자가 동시에 작업하게 할 수 있다.
이외에도 유용할 때가 있다.
- 데이터 모델 검사: 몇 가지 모델을 정의한 후에 관리 인터페이스에서 모델을 호출해 임시 데이터를 넣어보며 실수나 기타 문제를 확인할 수 있다.
- 획득된 데이터 관리: 외부에서 오는 데이터에 의존하는 프로그램인 경우, 관리자 사이트에서 쉽게 검사하고 편집할 수 있다.
- 빠른 데이터 관리 응용 프로그램: 관리자 사이트를 사용해 매우 간단한 데이터 관리 응용 프로그램을 만들 수 있다. 자신의 필요에 맞게 뭔가 제작할 때 유용할 것이다.
하지만 관리자 사이트는 데이터의 공용 인터페이스가 아니며 데이터의 정교한 정렬 및 검색을 허용하지도 않는다. 관리자 사이트는 신뢰할 수 있는 웹사이트 관리자를 위한 것이다.