Django의 Admin 사이트는 강력한 관리 인터페이스를 제공합니다. 기본적으로 Django에서 제공하는 이 기능은 모델 데이터를 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 빠르게 수행할 수 있도록 도와줍니다.


Site Configuration

Django Admin 사이트는 프로젝트 생성 시 기본적으로 활성화되어 있습니다.

python manage.py createsuperuser

명령어 실행 후 사용자 이름, 이메일, 비밀번호를 입력하여 관리자 계정을 생성합니다.

# urls.py

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

위 코드로 /admin/ URL로 Admin 페이지에 접근할 수 있도록 설정합니다.


Model Registration

모델을 Admin 사이트에서 관리하려면 admin.py 파일에 등록해야 합니다.

# admin.py

from django.contrib import admin
from .models import Author, Post

admin.site.register(Author)
admin.site.register(Post)

위 코드로 AuthorPost 모델이 Admin 사이트에 표시됩니다.


Customization

관리 인터페이스를 커스터마이징하려면 ModelAdmin 클래스를 사용합니다.

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'created_at', 'is_published') # 리스트에 표시할 필드
    search_fields = ('title', 'content') # 검색창에서 검색할 필드
    readonly_fields = ('created_at') # 읽기 전용 필드
    list_filter = ('created_at', 'author') # 필터 추가
    ordering = ('-created_at',) # 정렬 기준

admin.site.register(Post, PostAdmin)
  • list_display: 리스트 화면에서 표시할 필드.
  • search_fields: 검색 가능한 필드.
  • readonly_fields: 수정 불가능한 필드.
  • list_filter: 사이드바 필터 추가.
  • ordering: 기본 정렬 기준 설정.

Filter

필터링을 더 세부적으로 설정하려면 커스텀 필터를 정의할 수 있습니다.

class PublishedFilter(admin.SimpleListFilter):
    title = '공개 여부'
    parameter_name = 'is_published'

    def lookups(self, request, model_admin):
        return [
            ('published', '공개됨'),
            ('draft', '비공개'),
        ]

    def queryset(self, request, queryset):
        if self.value() == 'published':
            return queryset.filter(is_published=True)
        elif self.value() == 'draft':
            return queryset.filter(is_published=False)

class PostAdmin(admin.ModelAdmin):
    list_filter = ('author', PublishedFilter) # 커스텀 필터 포함

Action

데이터에 대한 사용자 정의 액션을 정의할 수 있습니다.

def mark_as_published(modeladmin, request, queryset):
    queryset.update(is_published=True)

mark_as_published.short_description = "선택된 게시글을 공개로 변경"

class PostAdmin(admin.ModelAdmin):
    actions = [mark_as_published]

References