본문 바로가기
Django

Django [관리자 페이지] admin site 목록,폼 변경

by nyanguk 2021. 1. 30.

관리자 페이지에 모델을 등록하였는데 무언가 밋밋하다. 관리자의 입장에서 각 데이터들이 정렬되고 또 검색할 수 있고 다른 모델의 데이터를 현재 모델에서 볼수 있도록 한다면 더욱 좋을 것이다. 

그래서 관리자의 입맛에 맞춰서 해당 모델을 특정 목록을 가진 페이지로 만들어 보고자 한다.

관리자 페이지에 포함되는 것 뿐만 아니라 폼 자체를 을 변경 하는 것이다.

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을 동시에 선언 할 수 없다는 것이다.

 

바뀐 입력 폼의 레이아웃을 확인하자!

 

참조한 공식문서

https://docs.djangoproject.com/en/3.1/ref/contrib/admin/

https://docs.djangoproject.com/en/1.11/ref/contrib/admin/