다른 프레임워크와 비교하여 장고는 최소한의 작업만으로 어드민 인터페이스를 만들 수 있다는 장점이 있습니다. 그러한 어드민에 대해 알아봅니다.
등록법1 : 기본 ModelAdmin
from django.contrib import admin
from .models import Post
admin.site.register(Post)
등록법2 : 지정한 ModelAdmin
admin.ModelAdmin
상속을 통한 커스텀마이징이 가능하다.
from django.contrib import admin
from .models import Post
class PostAdmin(admin.ModelAdmin):
pass
admin.site.register(Post, PostAdmin)
💡 등록법3 : The register decorator
가장 많이 선호되는 방식이다.
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
pass
⚡ 일반적으로 장고의 어드민 기능은 깊은 수준까지 커스텀마이징할 피요가 없다. 장고의 어드민 기능을 커스텀마이징하기보다는 목적에 부합하는 뷰나 폼을 아예 새로 만드는 것이 일의 수고를 덜기도 한다.
list_display : 모델 리스트에 출력할 컬럼 지정. list_display
를 설정하지 않으면 __str__()
에 각 개체의 표현을 표시하는 단일 열이 표시된다.
list_display_links : list_display
에 지정된 이름 중에 detail 링크를 걸 속성 리스트
list_editable : 편집을 허용할 모델의 필드를 설정한다. 즉 인스턴스로 이동하지 않고 바로 수정가능하게 해줌.
list_filter : 지정 필드값으로 필터링 옵션 제공
search_fileds : admin내 검색UI를 통해, DB를 통한 where 쿼리 대상 필드 리스트
◽ 모든 장고 모델에 대해 항상 객체를 스트링으로 표현해주는
__str__()
메서드를 구현하자.__str__()
의 결과가 장고 모델의 인스턴스 이름을 대표할 수 있도록 정한다. 어드민 리스트 페이지에서 객체에 대한 문자열 표현이 매끄럽게 처리된다.
◽ 어드민 리스트의 항목들이 해당 객체의 문자열 값(이름)을 보여주는 것이 아니라면list_display
를 이용하자.
from django.db import models
class IceCreamBar(models.Model):
name = models.CharField(max_length=100)
filling = models.CharField(max_length=100)
def __str__(self):
return self.name
list_editable fields don't support 'save' in multiuser environment
Django에서의 레코드는 레코드의 프라이머리 키가 아니라 레코드의 순서로 식별되기 때문에 다중 사용자가 이용하는 환경에서 list_editable을 이용하면 문제가 발생할 수 있다.
다중 사용자가 이용하는 환경을 생각해보자. A라는 관리자가 데이터를 삽입하는 동안 B가 admin 페이지에서 list_editable 항목이 있는 페이지를 열면 필드 값이 모델의 다른 인스턴스 값으로 업데이트될 수 있다.
models.py
from django.conf import settings
from django.db import models
class POST(models.Model):
message = models.TextField(blank=True)
# null=True 를 사용하고 싶다면, NullBooleanField를 이용한다
is_public = models.BooleanField(default=False, verbose_name='공개여부')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# __str__() : 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 toString() 메서드와 유사하다.
def __str__(self):
# return f"Custom Post object ({self.id})"
return self.message
admin.py
from django.contrib import admin
from .models import POST
@admin.register(POST) # Wrapping, Decorator
class POSTAdmin(admin.ModelAdmin):
list_display = ['id', 'message', 'message_length', 'is_public', 'created_at', 'updated_at']
list_display_links = ['message']
list_filter = ['created_at', 'is_public']
search_fields = ['message']
# 명시적으로 객체가 넘어와야함
def message_length(self, post):
return len(post.message)
message_length.short_description = "메시지 글자 수"
결과