django admin 뿌셔뿌셔

yo·2020년 7월 30일
1
post-thumbnail

1.


아래 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

우리는 일단 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)

위 코드의 결과는 아래 사진과 같다.

3 list_display

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)

5 list_editable

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)

6 list_filter

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)

7 search_fields

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)

8 inlines

관계가 엮여있는 테이블을 같이 보여줄 때 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

profile
Never stop asking why

0개의 댓글