아래 1), 2), 3)은 결과가 같다.
admin.py
from .models import Course, Lesson
1)
admin.site.register(Course)
2)
class CourseAdmin(admin.ModelAdmin):
pass
admin.site.register(Course, CourseAdmin)
3)
@admin.register(Course)
class CourseAdmin(admin.ModelAdmin):
pass
우리는 일단 2)를 사용하기로 하자.
Course의 column은 slug, title, description, allowed_memberships다.
admin페이지에서 원하는 컬럼만 보이기 위해 아래처럼 하면 된다.
title을 제외하고 모든 컬럼을 보이도록 해보자.
class CourseAdmin(admin.ModelAdmin):
fields = (
'slug',
description',
'allowed_memberships'
)
admin.site.register(Course, CourseAdmin)
fields대신 fieldsets를 사용할 수도 있다.
fieldsets는 두개의 튜플로 구성되있고, add form과 change form역할이 가능하다.
각 튜플엔 name과 fieldoptions가 들어간다. 아래에서 name은 None이다.
class CourseAdmin(admin.ModelAdmin):
fieldsets =
(None, {
'fields' : (
'slug',
'title',
'description',
'allowed_memberships'
)
}),
)
admin.site.register(Course, CourseAdmin)
위 코드의 결과는 아래 사진과 같다.
list_display는 어떤 컬럼을 보여줄지 결정한다.
아마도(?) 모델에 아래같이 title을 리턴하게 되있기 때문에 list_display가 없을 땐 디폴트로 title만 보여지는 것 같다..
def__str__(self):
return self.title
아래처럼 list_display를 적용하고 결과를 보자.
class CourseAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'description')
fieldsets =
(None, {
'fields' : (
'slug',
'title',
'description',
'allowed_memberships'
)
}),
)
admin.site.register(Course, CourseAdmin)
아래처럼 메서드를 활용해 list_display를 보여줄 수도 있다.
class CourseAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'description', 'combine_title_and_slug')
fieldsets =
(None, {
'fields' : (
'slug',
'title',
'description',
'allowed_memberships'
)
}),
)
def combine_title_and_slug(self, obj):
return "{} - {}".format(obj.title, obj.slug)
admin.site.register(Course, CourseAdmin)
list_display_links는 컬럼명을 눌렀을 때 해당 인스턴스로 이동하도록 해준다.
아래 예시에선 title과 slug에 파란불이 들어오고, 클릭하면 그 인스턴스로 넘어가도록 해준다.
class CourseAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'description', 'combine_title_and_slug')
list_display_links = ('title', 'slug')
fieldsets =
(None, {
'fields' : (
'slug',
'title',
'description',
'allowed_memberships'
)
}),
)
def combine_title_and_slug(self, obj):
return "{} - {}".format(obj.title, obj.slug)
admin.site.register(Course, CourseAdmin)
list_editable은 인스턴스로 이동하지 않고 바로 수정가능하게 해준다.
주의할 점: 특정 컬럼을 list_display_links와 list_editable에 중복해서 사용할 수 없다.
수정도 할 수 있고, 누르면 바로 이동까지 가능한 것은 말 자체가 안됨!
class CourseAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'description', 'combine_title_and_slug')
list_display_links = ('title', 'slug')
list_editable = ('slug')
fieldsets =
(None, {
'fields' : (
'slug',
'title',
'description',
'allowed_memberships'
)
}),
)
def combine_title_and_slug(self, obj):
return "{} - {}".format(obj.title, obj.slug)
admin.site.register(Course, CourseAdmin)
list_filter는 특정 컬럼을 필터할 수 있게 해준다.
class CourseAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'description', 'combine_title_and_slug')
list_display_links = ('title', 'slug')
list_editable = ('slug')
list_filter = ('title', 'slug')
fieldsets =
(None, {
'fields' : (
'slug',
'title',
'description',
'allowed_memberships'
)
}),
)
def combine_title_and_slug(self, obj):
return "{} - {}".format(obj.title, obj.slug)
admin.site.register(Course, CourseAdmin)
search_fields로 검색기능 구현 가능하다.
class CourseAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'description', 'combine_title_and_slug')
list_display_links = ('title', 'slug')
list_editable = ('slug')
list_filter = ('title', 'slug')
search_fields = ('title', 'slug')
fieldsets =
(None, {
'fields' : (
'slug',
'title',
'description',
'allowed_memberships'
)
}),
)
def combine_title_and_slug(self, obj):
return "{} - {}".format(obj.title, obj.slug)
admin.site.register(Course, CourseAdmin)
관계가 엮여있는 테이블을 같이 보여줄 때 inlines를 사용한다.
StackedInline과 TabularInline형태가 있다.
admin page에서 add course를 누르면, course등록하는 곳 아래에 lessons를 등록하는 화면도 생긴다. extra는 lesson추가 창을 몇개까지 보일지 정한다. max_num도 몇개까지 보일지 정한다.(두개가 헷갈린다)
from .models import Course, Lesson
class InLineLesson(admin.StackedInline):
model = Lesson
extra = 1
max_num = 3
class CourseAdmin(admin.ModelAdmin):
inlines = [InLineLesson]
list_display = ('title', 'slug', 'description', 'combine_title_and_slug')
list_display_links = ('title', 'slug')
list_editable = ('slug')
list_filter = ('title', 'slug')
search_fields = ('title', 'slug')
fieldsets =
(None, {
'fields' : (
'slug',
'title',
'description',
'allowed_memberships'
)
}),
)
def combine_title_and_slug(self, obj):
return "{} - {}".format(obj.title, obj.slug)
admin.site.register(Course, CourseAdmin)
위사진은 stacked
아래사진은 tabular