로딩 중이에요... 🐣
10 Django Admin 커스터마이징 | ✅ 편저: 코담 운영자
Django 웹 프로그래밍 강좌 10강 - Django Admin 커스터마이징 (Django 5.2 기준)
이 강의는 Django 공식 문서의 2.2 튜토리얼 내용을 바탕으로 진행되며, Django 5.2 버전에 맞춰 Admin 화면을 커스터마이징하는 방법을 설명합니다.
📚 공식문서 주소: https://docs.djangoproject.com/ko/5.2/ref/contrib/admin/
1. Admin 기본 확장: ModelAdmin 클래스 활용
기본 admin.site.register(Model)
방식은 단순 등록만 제공하며, 세부 커스터마이징이 불가능합니다.
보다 유연한 관리를 위해서는 ModelAdmin
클래스를 정의해야 합니다.
예시:
from django.contrib import admin
from .models import Question, Choice
class QuestionAdmin(admin.ModelAdmin):
fields = ["pub_date", "question_text"]
admin.site.register(Question, QuestionAdmin)
fields
: 관리 화면에 보여질 필드 순서를 지정QuestionAdmin
클래스를admin.site.register()
의 두 번째 인자로 넘겨 커스터마이징 적용
불필요한 필드를 숨기거나, 순서를 바꾸는 데 유용하게 활용됩니다.
2. 필드 그룹화: fieldsets 사용
많은 필드를 입력받는 모델의 경우 시각적 그룹화를 통해 관리 편의성을 높일 수 있습니다.
예시:
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
("질문 정보", {"fields": ["question_text"]}),
("날짜 정보", {"fields": ["pub_date"]}),
]
fieldsets
는 튜플 리스트 형태이며, 각 그룹에는 제목과 필드 목록이 들어갑니다.- 제목을 생략하려면
None
을 사용하면 됩니다.
필드 그룹화를 통해 관리자 화면의 가독성을 높일 수 있습니다.
3. Choice 인라인 등록 (StackedInline / TabularInline)
질문(Question)을 생성하면서 바로 선택지(Choice)를 등록할 수 있도록 인라인 관리 기능을 추가할 수 있습니다.
예시:
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 3 # 기본 제공되는 빈 폼 개수
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
("질문 정보", {"fields": ["question_text"]}),
("날짜 정보", {"fields": ["pub_date"]}),
]
inlines = [ChoiceInline]
StackedInline
: 필드들이 세로로 나열됨 (기본형)TabularInline
: 필드들이 테이블 형식으로 정렬됨 (실무에서 선호)
extra
는 새 객체 생성 시 제공될 폼의 개수를 지정합니다.
4. 리스트 출력 커스터마이징 (list_display)
Admin 목록 페이지에서 보이는 컬럼을 설정할 수 있습니다.
예시:
class QuestionAdmin(admin.ModelAdmin):
list_display = ["question_text", "pub_date", "was_published_recently"]
list_display
: 목록에 보여줄 필드 또는 메서드was_published_recently
: 모델 메서드도 사용 가능
커스텀 필드 꾸미기
@admin.display(ordering="pub_date", boolean=True, description="최근 발행")
def was_published_recently(self):
...
@admin.display
는 Django 3.2부터 도입된 데코레이터로, 정렬 기준, 불린 출력, 설명을 지정할 수 있습니다.
커스텀 메서드를 admin 리스트에 자연스럽게 통합할 수 있습니다.
5. 필터, 검색창 추가 (list_filter, search_fields)
질문 목록에서 날짜나 텍스트를 기준으로 빠르게 필터링하거나 검색할 수 있습니다.
예시:
class QuestionAdmin(admin.ModelAdmin):
list_display = ["question_text", "pub_date", "was_published_recently"]
list_filter = ["pub_date"]
search_fields = ["question_text"]
list_filter
: 오른쪽 사이드바에 필터 옵션 생성search_fields
: 상단 검색창 생성 (부분 문자열 검색 지원)
실제 관리자 페이지에서 자주 사용되는 기능이므로 필수 설정 요소입니다.
6. Admin 템플릿 커스터마이징
Django는 Admin 템플릿도 오버라이드할 수 있습니다. 예를 들어, 로고나 제목을 변경하고 싶을 때 사용합니다.
커스터마이징 절차
- 프로젝트 루트에
templates/admin
디렉토리 생성 - Django 기본 admin 템플릿 위치에서
base_site.html
복사 - 수정 후 저장
settings.py에 경로 등록
TEMPLATES = [
{
...
"DIRS": [BASE_DIR / "templates"],
...
}
]
제목 변경 예시 (templates/admin/base_site.html
)
{% extends "admin/base.html" %}
{% block title %}My Custom Admin{% endblock %}
{% block branding %}<h1 id="site-name">My Custom Admin</h1>{% endblock %}
Django 기본 admin은
admin/base.html
과 그 자식 템플릿들로 구성되어 있으므로 원하는 위치만 선택적으로 덮어쓰면 됩니다.
마무리 요약
ModelAdmin
으로 등록/수정 화면 커스터마이징 가능Inline
클래스로 외래키 모델도 함께 관리 가능list_display
,list_filter
,search_fields
는 관리자 효율성을 향상시킴@admin.display
로 메서드를 보기 좋게 출력 가능- 템플릿 커스터마이징으로 관리자 화면도 브랜드화 가능
Django 튜토리얼 마무리
이번 10강을 마지막으로 Django 공식 튜토리얼 기반 강의를 마칩니다. 지금까지 학습한 내용을 기반으로 자신만의 프로젝트를 실습하며 반복하고, 필요 시 공식 문서를 참조해보세요.
반복 학습과 실습이 진짜 실력을 만들어 줍니다. 감사합니다.