admin 컴포넌트 사용
Django는 웹 기반의 관리 도구를 제공합니다.
Django의 자동 관리 도구는 django.contrib의 일부입니다. 프로젝트의 settings.py 파일 내 INSTALLED_APPS 섹션에서 이를 확인할 수 있습니다:
# 애플리케이션 정의
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"app01"
]
django.contrib는 방대한 기능 집합이며 Django 기본 코드의 중요한 부분을 구성합니다.
관리 도구 활성화
일반적으로 urls.py에서 프로젝트 생성 시 자동으로 설정됩니다:
from django.urls import path
from django.contrib import admin
urlpatterns = [
path('admin/', admin.site.urls),
]
위 설정이 완료되면 Django 관리 도구가 실행됩니다.
현재 설정된 라우팅은 다음과 같은 매핑을 생성합니다:
/admin/ /admin/login/ /admin/logout/ /admin/password_change/ /admin/password_change/done/
/admin/app명/model명/ /admin/app명/model명/add/ /admin/app명/model명/ID값/history/ /admin/app명/model명/ID값/change/ /admin/app명/model명/ID값/delete/
admin 인터페이스 한글화
기본 admin 백엔드 인터페이스는 영어로 되어 있으며 영어에 익숙하지 않은 사용자에게 불편함을 줄 수 있습니다. settings.py에서 다음 설정을 통해 이를 해결할 수 있습니다:
- LANGUAGE_CODE = 'ko-kr'
- TIME_ZONE = 'Asia/Seoul'
1.8 버전 이후의 language code 설정은 다음과 다릅니다:
- LANGUAGE_CODE = 'ko'
- TIME_ZONE = 'Asia/Seoul'
관리 도구 사용
개발 서버를 시작한 후 브라우저에서 http://127.0.0.1:8000/admin/ 주소로 접속하여 로그인 화면을 얻습니다. python manage.py createsuperuser 명령을 통해 슈퍼 사용자를 생성할 수 있습니다.
admin 인터페이스에서 특정 데이터 모델을 관리하려면 먼저 해당 모델을 등록해야 합니다:
from django.db import models
class Author(models.Model):
이름 = models.CharField(max_length=32)
나이 = models.IntegerField()
def __str__(self):
return self.이름
class Publish(models.Model):
이름 = models.CharField(max_length=32)
이메일 = models.EmailField()
def __str__(self):
return self.이름
class Book(models.Model):
제목 = models.CharField(max_length=32)
발행일 = models.DateField()
가격 = models.DecimalField(max_digits=5, decimal_places=2)
출판사 = models.ForeignKey(to="Publish")
저자들 = models.ManyToManyField(to='Author')
def __str__(self):
return self.제목
admin 커스터마이징
admin.py에서 모델 클래스 중 하나를 등록하면 Admin에서 추가, 삭제, 수정, 조회 기능을 사용할 수 있습니다:
admin.site.register(models.UserInfo)
하지만 이 방법은 간단하며 더 많은 커스텀 작업을 수행하려면 ModelAdmin을 활용해야 합니다:
방법 1:
class UserAdmin(admin.ModelAdmin):
list_display = ('사용자', '비밀번호',)
admin.site.register(models.UserInfo, UserAdmin) # 첫 번째 매개변수는 리스트일 수 있음
방법 2:
@admin.register(models.UserInfo) # 첫 번째 매개변수는 리스트일 수 있음
class UserAdmin(admin.ModelAdmin):
list_display = ('사용자', '비밀번호',)
ModelAdmin은 다양한 커스텀 기능을 제공합니다:
1. list_display, 목록 표시 시 컬럼 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
list_display = ('사용자', '비밀번호', 'xxxxx')
def xxxxx(self, obj):
return "xxxxx"
2. list_display_links, 목록 표시 시 클릭 가능한 링크 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
list_display = ('사용자', '비밀번호', 'xxxxx')
list_display_links = ('비밀번호',)
3. list_filter, 목록 표시 시 빠른 필터링 설정.
4. list_select_related, 목록 표시 시 연관 쿼리 자동 select_related 여부 설정.
5. list_editable, 목록 표시 시 편집 가능한 컬럼 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
list_display = ('사용자', '비밀번호','그룹',)
list_editable = ('그룹',)
6. search_fields, 목록 표시 시 퍼지 검색 기능 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
search_fields = ('사용자', '비밀번호')
7. date_hierarchy, 목록 표시 시 Date 및 DateTime 타입 검색 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
date_hierarchy = '생성시간'
8 inlines, 상세 페이지에서 다른 테이블과 현재 테이블 간 FK 관계가 있을 경우 동적 추가 및 삭제 가능 설정:
class UserInfoInline(admin.StackedInline): # TabularInline
extra = 0
model = models.UserInfo
class GroupAdminMode(admin.ModelAdmin):
list_display = ('id', '제목',)
inlines = [UserInfoInline, ]
9 action, 목록 표시 시 커스텀 동작 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
def my_action(self, request, queryset):
print(self, request, queryset)
print(request.POST.getlist('_selected_action'))
my_action.short_description = "커스텀 액션 설명"
actions = [my_action, ]
# Action 옵션 모두 페이지 상단에 표시
actions_on_top = True
# Action 옵션 모두 페이지 하단에 표시
actions_on_bottom = False
# 선택 개수 표시 여부
actions_selection_counter = True
10 HTML 템플릿 커스터마이징:
add_form_template = None
change_form_template = None
change_list_template = None
delete_confirmation_template = None
delete_selected_confirmation_template = None
object_history_template = None
11 raw_id_fields, 상세 페이지에서 FK 및 M2M 필드를 입력 상자 형태로 변경:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
raw_id_fields = ('FK필드', 'M2M필드',)
12 fields, 상세 페이지에서 표시할 필드 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
fields = ('사용자',)
13 exclude, 상세 페이지에서 제외할 필드 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
exclude = ('사용자',)
14 readonly_fields, 상세 페이지에서 읽기 전용 필드 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
readonly_fields = ('사용자',)
15 fieldsets, 상세 페이지에서 데이터를 세그먼트별로 나누어 표시 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
fieldsets = (
('기본 정보', {
'fields': ('사용자', '비밀번호', '생성시간',)
}),
('추가 정보', {
'classes': ('collapse', 'wide', 'extrapretty'),
'fields': ('사용자', '비밀번호'),
}),
)
16 상세 페이지에서 M2M 필드 표시 시 데이터 이동 선택 (방향: 위아래 또는 좌우):
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
filter_vertical = ("m2m필드",) # 또는 filter_horizontal = ("m2m필드",)
17 ordering, 목록 표시 시 데이터 정렬 규칙 설정:
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
ordering = ('-id',)
또는
def get_ordering(self, request):
return ['-id', ]
18 radio_fields, 상세 페이지에서 옵션을 라디오 버튼으로 표시 (FK 기본값은 드롭다운):
radio_fields = {"그룹": admin.VERTICAL} # 또는 admin.HORIZONTAL
19 form = ModelForm, 사용자 요청 시 폼 유효성 검사용:
from app01 import models
from django.forms import ModelForm
from django.forms import fields
class MyForm(ModelForm):
기타 = fields.CharField()
class Meta:
model = models.UserInfo
fields = "__all__"
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
form = MyForm
20 empty_value_display = "컬럼 데이터가 비어있을 때 기본값 표시":
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
empty_value_display = "데이터 없음"
list_display = ('사용자','비밀번호','업데이트')
def 업데이트(self,obj):
return obj.사용자
업데이트.empty_value_display = "데이터 없음"