장고 마스터하기 - 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 = Trueblank = 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_verticalfilter_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. 프로젝트 담당 기자가 개발자 중 1명을 만나 데이터를 설명한다.
  2. 개발자는 이 데이터에 맞게 장고 모델을 설계한 후 관리자 웹 사이트를 기자에게 보여준다.
  3. 기자는 점검해 누락된 필드나 외부 필드를 지적하고, 개발자가 수정한다.
  4. 모델이 합의되면 기자가 관리자 웹 사이트를 사용해 데이터를 입력한다. 동시에 개발자는 공개할 템플릿을 개발할 수 있다.

즉 관리 인터페이스는 콘텐츠 제작자와 개발자가 동시에 작업하게 할 수 있다.

이외에도 유용할 때가 있다.

  • 데이터 모델 검사: 몇 가지 모델을 정의한 후에 관리 인터페이스에서 모델을 호출해 임시 데이터를 넣어보며 실수나 기타 문제를 확인할 수 있다.
  • 획득된 데이터 관리: 외부에서 오는 데이터에 의존하는 프로그램인 경우, 관리자 사이트에서 쉽게 검사하고 편집할 수 있다.
  • 빠른 데이터 관리 응용 프로그램: 관리자 사이트를 사용해 매우 간단한 데이터 관리 응용 프로그램을 만들 수 있다. 자신의 필요에 맞게 뭔가 제작할 때 유용할 것이다.

하지만 관리자 사이트는 데이터의 공용 인터페이스가 아니며 데이터의 정교한 정렬 및 검색을 허용하지도 않는다. 관리자 사이트는 신뢰할 수 있는 웹사이트 관리자를 위한 것이다.

김땡땡's blog

김땡땡's blog

김땡땡