Django Admin

김기훈·2025년 12월 28일

Django

목록 보기
11/17

관리자 사이트 🔴

  • Django Admin은 Django의 가장 강력한 기능 중 하나로,
    • 모델(Model) 정의만으로 데이터 관리를 위한 프로덕션 수준의 인터페이스를 자동으로 생성해줌

Django Admin 개요

  • "신뢰할 수 있는 사용자(관리자)"가 콘텐츠를 관리하기 위한 도구
    • 공용 인터페이스가 아니며, 사이트 관리자가 데이터를 생성, 조회, 업데이트, 삭제(CRUD)할 수 있도록 도움
      • 자동 생성

        • models.py에 정의된 데이터 구조를 읽어 UI를 만듬
      • 보안

        • 인증 시스템이 기본 내장되어 있어 로그인한 관리자만 접근 가능하게 함

기본 활성화 및 사용법

  • 프로젝트를 생성(startproject)하면 기본적으로 활성화되어 있음
    • 설정 확인(settings.py & urls.py)

      • INSTALLED_APPS: django.contrib.admin이 포함되어 있어야 함
      • MIDDLEWARE: AuthenticationMiddleware와 MessageMiddleware가 필요
      • URL 설정: urls.py에 path('admin/', admin.site.urls)가 연결 필요
    • 관리자 계정 생성 (Superuser)

      • python manage.py createsuperuser

모델 등록하기 (admin.py)

  • 앱 디렉토리 내의 admin.py 파일에서 모델을 등록해야 관리자 페이지에 나타남
# --- [ 기본적은 등록 방법 ] ---

from django.contrib import admin
from .models import MyModel

admin.site.register(MyModel)

ModelAdmin 🔴

  • 관리자 페이지 커스터마이징

  • 단순 등록을 넘어, ModelAdmin 클래스를 상속받아 관리자 페이지의 동작과 레이아웃을 세밀하게 제어 가능

리스트 페이지 커스터마이징

  • 데이터 목록을 보여주는 화면을 제어하는 옵션들

  • list_display
    • 모델 목록 페이지에서 보여줄 필드(컬럼)들을 튜플/리스트로 정의
  • list_filter
    • 특정 필드(주로 Choice나 ForeignKey)를 기준으로 데이터를 필터링하는 기능을 제공
    • 우측 사이드바에 필터 기능을 추가 (예: 날짜, 카테고리 등)
  • search_fields
    • 상단에 검색창을 추가하고, 검색할 필드를 지정
  • raw_id_fields
    • 관계형 필드에서 드롭다운 대신 ID를 직접 입력하거나 팝업으로 선택하게 함 (데이터가 많을용)
  • list_editable
    • 목록 페이지에서 상세 페이지로 이동하지 않고 바로 수정 가능하게 함
  • list_per_page
    • 한 페이지당 표시할 항목 수를 지정 (기본 100)
  • ordering
    • 기본 정렬 순서를 지정
  • is_staff
    • Admin 페이지에 로그인할 수 있는 권한만 부여하며, 구체적인 모델 접근 권한은 별도로 할당해야 함
  • 리스트 페이지 사용 예시

from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ["title", "author", "publication_date", "price"]
    list_filter = ["publication_date", "author"]
    search_fields = ["title", "author__name"] # 관계형 필드 검색 가능
    ordering = ["-publication_date"]

상세/수정 페이지 커스터마이징

  • 개별 데이터를 수정하거나 추가하는 화면을 제어

  • fields / exclude

    • 상세 수정 페이지에서 필드의 순서나 그룹화를 설정
    • 폼에 표시할 필드 순서를 정하거나, 숨길 필드를 지정함
  • fieldsets

    • 필드들을 섹션(그룹)으로 묶어 제목을 달고 레이아웃을 정리
  • readonly_fields

    • 수정이 불가능하고 읽기만 가능한 필드를 지정
  • prepopulated_fields

    • 다른 필드의 값을 기반으로 자동 입력되게 함 (주로 slug 생성 시 사용)
  • 예시 코드 (Fieldsets 사용)

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    fieldsets = [
        ("기본 정보", {"fields": ["title", "author"]}),
        ("상세 정보", {"fields": ["isbn", "price"], "classes": ["collapse"]}), 
    ]

관계형 데이터 처리 (Inlines)

  • ForeignKey나 ManyToManyField로 연결된 모델을 부모 모델의 수정 페이지에서 한 번에 편집할 수 있게 해줌
    • TabularInline: 가로(행) 형태로 나열 (공간 효율적)

    • StackedInline: 세로 형태로 나열

class ReviewInline(admin.TabularInline):
    model = Review
    extra = 1 # 추가로 보여줄 빈 폼의 개수

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    inlines = [ReviewInline] # Book 페이지에서 Review도 같이 관리

데코레이터 🔴

@admin.register

  • admin.site.register(Model, AdminClass) 함수를 호출하는 대신,
    • 클래스 위에 데코레이터를 붙여 "이 Admin 클래스는 저 모델을 담당한다"고 명시함
      • 장점: 모델과 Admin 클래스의 연결 관계가 코드 상단에 바로 보임
      • 사용법: 하나 이상의 모델을 동시에 등록 가능
from django.contrib import admin
from .models import Post, Comment

# 기존 방식: admin.site.register(Post, PostAdmin) 대신 사용
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ['title', 'created_at']

# 여러 모델 동시 등록 가능
@admin.register(Comment, Reply)
class CommentAdmin(admin.ModelAdmin):
    pass

@admin.display

  • list_display에 모델 필드가 아닌 커스텀 메서드를 보여줄 때 사용

  • 주요 인자 (Arguments):

    • description: 컬럼의 헤더 이름 (제목)
    • ordering: 해당 컬럼을 클릭했을 때 정렬 기준이 될 모델 필드
    • boolean: True로 설정 시, 값 대신 아이콘(✔/✖)으로 표시
    • empty_value: 값이 None일 때 보여줄 문자열 (기본값은 -)
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ['name', 'is_expensive', 'stock_status']

    # 1. 계산된 값에 정렬 기능 추가
    @admin.display(description='고가 제품 여부', boolean=True, ordering='price')
    def is_expensive(self, obj):
        return obj.price > 10000

    # 2. None 값 처리 및 컬럼명 지정
    @admin.display(description='재고 상태', empty_value='알 수 없음')
    def stock_status(self, obj):
        if obj.stock is None:
            return None
        return f"{obj.stock}개 남음"

@admin.action

  • 리스트 페이지 상단의 "Action" 드롭다운 메뉴(예: 선택된 객체 삭제)에 새로운 기능을 추가할 때 사용

  • 주요 인자:

    • description: 드롭다운 메뉴에 표시될 텍스트
    • permissions: (선택) 특정 권한이 있는 관리자에게만 보이도록 설정
# 함수를 클래스 외부에 정의하거나 내부에 정의할 수 있습니다.

@admin.action(description="선택된 게시물을 '발행' 상태로 변경")
def make_published(modeladmin, request, queryset):
    # 선택된 쿼리셋을 한 번에 업데이트
    updated_count = queryset.update(status='published')
    modeladmin.message_user(request, f"{updated_count}건이 발행되었습니다.")

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    actions = [make_published]
profile
안녕하세요.

0개의 댓글