Django Admin 관리 도구 사용, 커스터마이징 및 소스 코드 분석

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에서 다음 설정을 통해 이를 해결할 수 있습니다:

  1. LANGUAGE_CODE = 'ko-kr'
  2. TIME_ZONE = 'Asia/Seoul'

1.8 버전 이후의 language code 설정은 다음과 다릅니다:

  1. LANGUAGE_CODE = 'ko'
  2. 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 = "데이터 없음"

태그: Django admin python web-development

6월 3일 19:06에 게시됨