Django [관리자 페이지] admin site 목록,폼 변경
관리자 페이지에 모델을 등록하였는데 무언가 밋밋하다. 관리자의 입장에서 각 데이터들이 정렬되고 또 검색할 수 있고 다른 모델의 데이터를 현재 모델에서 볼수 있도록 한다면 더욱 좋을 것이다.
그래서 관리자의 입맛에 맞춰서 해당 모델을 특정 목록을 가진 페이지로 만들어 보고자 한다.
관리자 페이지에 포함되는 것 뿐만 아니라 폼 자체를 을 변경 하는 것이다.
ModelAdmin객체
관리 인터페이스에서 모델의 표현으로 기본 관리 인터페이스가 맘에 들지 않을때 ModelAdmin객체를 생성하여 이 객체를 대신 하여 등록 시킬 수 있다.
ModelAdmin이 제공하는 많은 옵션들이 있지만 추후에 다루도록 하고 오늘은 주로 목록 변경에 초점을 맞추려고한다.
모델의 목록변경
list_per_page
한페이지 내에 표시될 데이터들의 개수를 나타낸다.
list_per_page = 5
list_display
데이터가 표시 될때 포함 되어 표시될 필드들을 나열한다.또한 쿼리를 통해 얻을 수 있는 데이터를 필드로써 추가 할 수 있다.
list_display = (
'id','email','username','permission',
'is_certificated','certification_date','post_count',
)
이때 필드명에 해당하는 쿼리결과를 리턴하는 함수를 만들어야 하며 필드명.short_description 을 통해 필드명 그대로가 아닌 다른 이름으로 표기 할 수 있다.
def post_count(self, obj):
return Post.objects.filter(member=obj).count()
post_count.short_description = '작성한 글 수'
list_editable
관리자가 수정 할 수 있는 필드를 설정한다.
list_editable = ('permission',)
list_filter
필터링 요소를 선택 할 수 있는 필터링 창이 추가되며 인자로 전달된 필드를 사용하여 화면에 표시되는 목록을 필터링 할 수 있게 한다.
list_filter = ('permission', )
search_fields
검색을 위한 창이 추가 되며 검색을 하면 인자로 전달된 필드에서 검색을 시도하고 결과를 도출한다.
search_fields = ('username', )
ordering
-가 붙으면 내림차순으로 정렬 한다. 각 모델의 필드를 인자로 전달 한다.
ordering = ('-id', 'email', 'permission', )
member의 admin.py 를 기준으로 예시를 보였지만 전달인자로 어떤 값이나 필드를 넘기느냐에 따라 달라지는 것이므로 post의 admin.py도 금방 쓸 수 있을 것이다.
# Custom_admin/member/admin.py
from django.contrib import admin
from member.models import Member
from post.models import Post
class MemberAdmin(admin.ModelAdmin):
list_per_page = 5
list_display = (
'id','email','username','permission',
'is_certificated','certification_date','post_count',
)
list_editable = ('permission',)
list_filter = ('permission', )
search_fields = ('username', )
ordering = ('-id', 'email', 'permission', )
def post_count(self, obj):
return Post.objects.filter(member=obj).count()
post_count.short_description = '작성한 글 수'
# Register your models here.
admin.site.register(Member, MemberAdmin)
# Custom_admin/post/admin.py
from django.contrib import admin
from post.models import Category, Post, Comment
from member.models import Member
# Register your models here.
class PostAdmin(admin.ModelAdmin):
list_per_page = 10
list_display = (
'id', 'title', 'member','is_deleted', 'created_at', )
list_editable = ('is_deleted', )
list_filter = (
'member__permission',
'category__name', 'is_deleted', )
admin.site.register(Post,PostAdmin)
admin.site.register(Category)
admin.site.register(Comment)
이때 모델__필드는 list_filter에서 해당 모델의 특정 필드를 조회하라는 의미이다.
또한 장고에서는 언더스코어 두개를 사용하여 쿼리룩업 문법에 사용 될 수 있다.
모델의 폼 변경
fields
관리자 페이지에서 정보를 새롭게 추가하거나 이전 것을 수정할때 나오는 입력 폼을 알맞게 변경 할 수 있다.
# Custom_admin/post/admin.py의 PostAdmin안
fields = ('member','category','title',)
바뀐 입력 폼의 레이아웃을 확인하자!
fieldsets
fields와 동일하게 추가,수정 입력 폼을 변경 할 수있으나 조금 더 복잡한 레이아웃이라는 것이 다른점이다.
입력 폼의 요소들을 여러개의 섹션으로 나누거나 한줄에 여러개의 필드를 입력 할 수있게 한다.
# Custom_admin/post/admin.py의 PostAdmin안
fieldsets = (
('기본정보', {
"fields": (('member','category')),
}),
('제목 및 내용', {
"fields": ('title','content',),
}),
('삭제', {
"fields": ('is_deleted',),
})
)
※ 주의해야 할 점은 fields와 fieldsets을 동시에 선언 할 수 없다는 것이다.
바뀐 입력 폼의 레이아웃을 확인하자!