Django Admin 권한 부여: 기능 개인화 및 확장
Takashi Yamamoto
Infrastructure Engineer · Leapcell

소개
Django Admin 인터페이스는 놀랍도록 강력한 기본 기능으로, 애플리케이션 데이터를 빠르고 효율적으로 관리할 수 있는 방법을 제공합니다. 많은 Django 프로젝트에서 이는 기본 데이터 관리 도구 역할을 하여 개발 속도를 크게 향상시킵니다. 하지만 애플리케이션이 복잡해지고 비즈니스 요구사항이 더욱 미묘해짐에 따라 기본 관리자로는 종종 부족함을 느낍니다. 개발자들은 종종 특정 워크플로우에 더 적합하도록 관리자 인터페이스를 조정하거나, 사용자 경험을 향상시키거나, 완전히 사용자 정의 대시보드를 구축하지 않고도 고급 기능을 노출해야 하는 상황에 직면합니다. 이러한 더 깊은 통합 및 사용자 정의에 대한 필요성이 Django Admin 확장의 진정한 힘을 발휘하는 지점입니다. ModelAdmin
구성, 사용자 정의 Actions
, 맞춤 Filters
와 같은 기법을 숙달함으로써 개발자는 일반적인 관리 패널을 애플리케이션의 고유한 요구사항에 완벽하게 부합하는 매우 전문적이고 사용자 친화적인 제어 센터로 변환할 수 있습니다. 이 글에서는 이러한 필수 사용자 정의 지점을 안내하며 Django Admin의 잠재력을 최대한 발휘하는 방법을 보여줄 것입니다.
Django Admin 핵심 개념 사용자 정의
실질적인 측면으로 들어가기 전에, 우리가 논의할 핵심 Django Admin 구성 요소에 대한 명확한 이해를 확립해 봅시다. 이러한 요소는 대부분의 관리자 사용자 정의의 기반을 형성합니다.
-
ModelAdmin
: 이것은 Django Admin 내에서 특정 모델이 표시되고 관리되는 방식을 사용자 정의하는 가장 기본적인 개념입니다. 각ModelAdmin
클래스는 청사진 역할을 하여 개발자가 표시할 필드, 정렬 방식, 편집 가능한 필드, 심지어 데이터를 표시하기 위한 사용자 정의 메서드와 같은 다양한 옵션을 정의할 수 있도록 합니다. 모델별 관리자 구성의 중앙 허브입니다. -
Actions: Actions는 Django Admin의 목록 보기에서 선택한 객체에 대해 수행할 수 있는 함수입니다. 기본적으로 Django는 "선택한 객체 삭제" 액션을 제공합니다. 그러나 개발자는 관리자 인터페이스에서 직접 상태 변경, 알림 보내기 또는 데이터 내보내기와 같은 일괄 작업을 수행하기 위해 사용자 정의 작업을 만들 수 있습니다.
-
Filters: Filters를 사용하면 사용자가 특정 기준에 따라 변경 목록 보기(
change list view
)에 표시되는 객체 목록을 좁힐 수 있습니다. Django는 기본 필터링 기능을 제공하지만(예: 날짜, 부울 필드별), 사용자 정의 필터를 사용하면 관련 모델 속성, 계산된 속성 또는 비즈니스 로직에 의해 정의된 사용자 정의 기준별 필터링과 같이 더 복잡하고 애플리케이션별 필터링 옵션을 사용할 수 있습니다.
이제 실질적인 예제를 통해 이러한 개념을 구현하는 방법을 살펴보겠습니다.
ModelAdmin
을 사용한 디스플레이 향상
ModelAdmin
클래스는 관리자 사용자 정의의 대부분이 이루어지는 곳입니다. 간단한 Django 모델을 고려해 봅시다.
# myapp/models.py from django.db import models class Product(models.Model): name = models.CharField(max_length=100) price = models.DecimalField(max_digits=10, decimal_places=2) stock = models.IntegerField(default=0) is_published = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name
이 모델을 관리자에 등록하고 사용자 정의를 시작하려면:
# myapp/admin.py from django.contrib import admin from .models import Product @admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display = ('name', 'price', 'stock', 'is_published', 'created_at_display_formatted') list_filter = ('is_published', 'created_at') search_fields = ('name',) ordering = ('-created_at',) readonly_fields = ('created_at',) fieldsets = ( (None, { 'fields': ('name', 'price', 'stock') }), ('Status', { 'fields': ('is_published', 'created_at'), 'classes': ('collapse',) }), ) def created_at_display_formatted(self, obj): return obj.created_at.strftime("%Y-%m-%d %H:%M") created_at_display_formatted.short_description = 'Creation Date' created_at_display_formatted.admin_order_field = 'created_at' # Enables sorting
이 예제에서는:
list_display
: 변경 목록 페이지에 표시되는 필드를 제어합니다. 사용자 정의 메서드created_at_display_formatted
를 포함했습니다.list_filter
: 사용자 정의is_published
상태 또는created_at
범위별로 필터링할 수 있도록 오른쪽 사이드바에 필터를 추가합니다.search_fields
: 검색 창을 활성화하여 사용자가name
으로 검색할 수 있도록 합니다.ordering
: 목록의 기본 정렬 순서를 지정합니다 (새 제품 우선).readonly_fields
: 변경 양식에서created_at
을 편집할 수 없도록 합니다.fieldsets
: 변경 양식의 확장 가능한 섹션으로 필드를 구성하여 필드가 많은 모델의 가독성을 향상시킵니다.created_at_display_formatted
:ProductAdmin
의 사용자 정의 메서드로,created_at
타임스탬프를 형식화합니다. Django Admin은list_display
로 접두사가 지정된 메서드를 자동으로 인식하고 반환 값을 사용합니다.short_description
은 사람이 읽을 수 있는 열 헤더를 제공하며admin_order_field
는 열을 정렬 가능하게 만듭니다.
사용자 정의 작업 구현
사용자 정의 작업은 일괄 작업을 수행하는 데 매우 유용합니다. 선택된 제품을 게시하지 않도록 하는 작업을 추가해 봅시다.
# myapp/admin.py (continued) from django.contrib import admin from .models import Product from django.template.defaultfilters import pluralize from django.contrib import messages @admin.register(Product) class ProductAdmin(admin.ModelAdmin): # ... (previous configurations) actions = ['make_unpublished'] def make_unpublished(self, request, queryset): updated_count = queryset.update(is_published=False) self.message_user(request, f"{updated_count} product{pluralize(updated_count)} successfully marked as unpublished.", messages.SUCCESS) make_unpublished.short_description = "Mark selected products as unpublished"
작동 방식은 다음과 같습니다:
actions = ['make_unpublished']
:make_unpublished
메서드를 드롭다운 메뉴에서 사용 가능한 작업으로 등록합니다.make_unpublished(self, request, queryset)
: 사용자 정의 작업 메서드는self
(ModelAdmin 인스턴스),request
(현재 HttpRequest 객체) 및queryset
(선택된 객체의 QuerySet)을 받습니다.queryset.update(is_published=False)
: 이를 통해 단일 데이터베이스 쿼리로 모든 선택된Product
인스턴스를 효율적으로 업데이트합니다.self.message_user(...)
: 작업이 완료된 후 사용자에게 성공 메시지를 표시합니다.
고급 사용자 정의 필터 만들기
Django의 list_filter
는 간단한 필드 기반 필터링에 유용합니다. 더 복잡한 시나리오의 경우 사용자 정의 필터 클래스가 필요합니다. 재고가 "부족한" 제품(예: 재고 10개 미만)에 대한 필터를 만들어 봅시다.
# myapp/admin.py (continued) from django.contrib import admin from .models import Product from django.template.defaultfilters import pluralize from django.contrib import messages from django.utils.translation import gettext_lazy as _ class StockStatusFilter(admin.SimpleListFilter): title = _('stock status') # 필터 사이드바에 표시되는 제목 parameter_name = 'stock_status' # 이 필터의 URL 매개변수 def lookups(self, request, model_admin): """ 튜플 목록을 반환합니다. 각 튜플은 필터 옵션을 나타냅니다. 첫 번째 요소는 URL 쿼리에 포함될 값입니다. 두 번째 요소는 해당 옵션에 대한 사람이 읽을 수 있는 이름입니다. """ return [ ('low', _('Running Low')), ('in_stock', _('In Stock')), ('out_of_stock', _('Out of Stock')), ] def queryset(self, request, queryset): """ 선택한 조회 옵션을 기반으로 필터링을 적용합니다. """ if self.value() == 'low': return queryset.filter(stock__lt=10, stock__gt=0) if self.value() == 'in_stock': return queryset.filter(stock__gte=10) if self.value() == 'out_of_stock': return queryset.filter(stock__exact=0) return queryset # 선택 없음 또는 유효하지 않은 선택 시 원본 queryset 반환 @admin.register(Product) class ProductAdmin(admin.ModelAdmin): # ... (previous configurations) list_filter = ('is_published', 'created_at', StockStatusFilter) # 사용자 정의 필터 추가 actions = ['make_unpublished'] # ... (make_unpublished 메서드)
이 사용자 정의 필터에서:
StockStatusFilter(admin.SimpleListFilter)
: 간단하고 미리 정의된 선택을 위해admin.SimpleListFilter
에서 상속받습니다. 더 동적이거나 복잡한 필터의 경우admin.ListFilter
를 확장할 수 있습니다.title
및parameter_name
: 필터의 모양과 URL 매개변수를 정의합니다.lookups()
: 필터 사이드바에 표시되는 옵션을 제공합니다(예: "Running Low", "In Stock").queryset()
: 이것이 필터의 핵심입니다. 원본queryset
을 가져와 사용자의 선택(self.value()
)에 따라 특정 필터링 로직을 적용합니다.
이러한 기능에 대한 애플리케이션 시나리오는 광범위합니다:
ModelAdmin
: 필드 모양 사용자 정의, 양식 레이아웃, 계산된 필드 추가, 특정 필드에 대한 풍부한 텍스트 편집기 통합, 관련 객체 수 표시.- Actions: 콘텐츠 일괄 승인/거부, 선택한 데이터 CSV/Excel로 내보내기, 대량 이메일 보내기 또는 선택한 레코드에 대한 외부 API 호출 트리거.
- Filters: 구독 상태별 사용자 필터링, 여러 카테고리별 제품 필터링, 배송 상태 및 결제 방법별 주문 필터링 또는 조정 상태 및 작성자별 콘텐츠 필터링.
이 세 가지 강력한 메커니즘을 결합함으로써 Django Admin을 기본 CRUD 인터페이스에서 애플리케이션의 운영 요구 사항에 완벽하게 맞는 정교하고 맞춤화된 관리 시스템으로 변환할 수 있습니다.
결론
Django Admin은 기본적으로 강력하지만, 개발자가 확장성을 활용할 때 진정으로 빛을 발합니다. ModelAdmin
구성, 사용자 정의 Actions
, 맞춤 Filters
의 신중한 사용을 통해 관리자 워크플로를 크게 향상시키고, 대상 기능을 제공하며, 애플리케이션 관리자에게 가장 직관적인 방식으로 데이터를 표시할 수 있습니다. 이러한 사용자 정의 기법은 기본 데이터 관리를 넘어 견고하고 사용자 친화적인 백엔드 인터페이스를 구축하려는 모든 Django 개발자에게 기본 도구이며, 궁극적으로 일반 관리자를 전문 제어판으로 변환합니다.