관리 메뉴

Storage Gonie

36. (app2) Django admin페이지 customize하기 본문

웹개발/Django 웹서비스 개발(인프런)

36. (app2) Django admin페이지 customize하기

Storage Gonie 2019. 2. 20. 15:53
반응형

1. 데이터 입력순서 바꾸기

- admin.py에서 ModelAdmin을 상속받은 클래스를 생성해서 fields에 입력받을 순서를 지정해주고, 이 클래스를 모델과 함께 register 해주면 순서를 바꿀 수 있다.

admin.site.register(Question)
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date','question_text']

admin.site.register(Question, QuestionAdmin)

2. 입력폼에서 중간제목 넣기

- fields 대신에 fieldsets를 사용하여 중간제목을 넣어 카테고리화 하여 보여줄 수 있다.

class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields': ['question_text']}),
("Date Information", {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)

3. Question, Choice 두 모듈을 둘 다 한번에 입력받기

- admin.StackedInline을 상속받은 클래스를 생성하고 입력받을 모델과 몇개를 입력받을 지 지정해준다. 

- 그런 뒤 QuestionAdmin클래스 내부에 inlines 를 추가하고 생성한 클래스이름을 넣어준다.

- StackedInline과 TabularInline 둘중에 하나를 선택해서 사용할 수 있다.

<admin.StackedInline을 이용한 디자인>

class ChoiceInline(admin.StackedInline):
model = Choice # 어떤 모델을 입력받을 것인가.
extra = 1 # 한번에 객체 몇개의 내용을 입력받을 것인가?, 1이어도 짜장,짬뽕을 가지고 있어서 2개 입력칸이 만들어짐.

class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields': ['question_text']}),
("Date Information", {'fields': ['pub_date']}),
]
inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin)

<admin.TabularInline을 이용한 디자인>

class ChoiceInline(admin.TabularInline):
model = Choice # 어떤 모델을 입력받을 것인가.
extra = 1 # 한번에 객체 몇개의 내용을 입력받을 것인가?, 1이어도 짜장,짬뽕을 가지고 있어서 2개 입력칸이 만들어짐.

class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields': ['question_text']}),
("Date Information", {'fields': ['pub_date']}),
]
inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin)



4. 보기 / 감춤

- 'classes' : ['collapse']를 속성으로 추가해주면 적용됨

class ChoiceInline(admin.TabularInline):
model = Choice # 어떤 모델을 입력받을 것인가.
extra = 1 # 한번에 객체 몇개의 내용을 입력받을 것인가?, 1이어도 짜장,짬뽕을 가지고 있어서 2개 입력칸이 만들어짐.

class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields': ['question_text']}),
("Date Information", {'fields': ['pub_date'], 'classes': ['collapse']}), # fields는 입력받는 데이터, classes는 속성
]
inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin)



5. 객체내용 출력(함수연산결과 포함)

- list_display 에 tuple 형태로 속성이름을 넣어주면 추가적인 내용을 보여준다. 이때 메소드의 이름을 넣으면 그 결과가 보여지기도 한다.

class ChoiceInline(admin.TabularInline):
model = Choice # 어떤 모델을 입력받을 것인가.
extra = 1 # 한번에 객체 몇개의 내용을 입력받을 것인가?, 1이어도 짜장,짬뽕을 가지고 있어서 2개 입력칸이 만들어짐.

class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields': ['question_text']}),
("Date Information", {'fields': ['pub_date'], 'classes': ['collapse']}), # fields는 입력받는 데이터, classes는 속성
]
inlines = [ChoiceInline] # 함께 입력받을 모델
list_display = ('question_text', 'pub_date', 'was_published_recently') # 객체내용으로 보여질 내용
admin.site.register(Question, QuestionAdmin)




6. 정렬기능 추가

- QUESTION_TEXT, DATE_PUBLISHED는 누르면 정렬되는 기능이 기본적으로 제공되는데

- 함수의 결과값을 보여주는 WAS PUBLISHED RECENTLY은 정렬기능이 없다. 이를 정렬기능이 활성화 되도록 해보자.

- models.py에서 Question클래스에 아래의 한줄을 추가해주면 WAS PUBLISHED RECENTLY에도 정렬기능이 활성화 된다. 단, 지정해준 pub_date 값을 기준으로 정렬됨.

was_published_recently.admin_order_field = 'pub_date'


7. False, True 대신 O, X 모양으로 보여지게 하기.

- models.py에서 Question클래스에 아래의 두줄을 추가해주면 True False 대신 O, X 모양으로 보여진다.

- 또한 WAS PUBLISHED RECENTLY 이름 대신에 아래 입력해준 이름이 보여진다.

was_published_recently.boolean = True                            # 값이 O, X 모양으로 나타나게 됨.
was_published_recently.short_description = 'published recently?' # WAS PUBLISHED RECENTLY 대신 여기에 입력해준 값이 보여짐.


6, 7 을 한번에 보면아래와 같다.

class Question(models.Model):
question_text = models.CharField(max_length = 200)
pub_date = models.DateTimeField('date published') # ( ) 에 들어간 텍스트는 그냥 주석이다.

# 객체를 그대로 출력할 때 객체의 내용을 보여주도록 오버라이딩
def __str__(self):
return self.question_text
# 객체가 가지고 있는 날짜 >= 하루전의 시간(어제)라면 True
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now

was_published_recently.admin_order_field = 'pub_date' # 정렬버튼을 활성화 하고, 누를시 pub_date기준으로 정렬이 수행됨.
was_published_recently.boolean = True # 값이 O, X 모양으로 나타나게 됨.
was_published_recently.short_description = 'published recently?' # WAS PUBLISHED RECENTLY 대신 여기에 입력해준 값이 보여짐.

8. 리스트의 필터기능

- QuestionAdmin클래스에 list_filter를 추가하여 여기에 속성값을 주면 아래와 같은 디자인을 사용할 수 있음.

- 오른쪽에 필터가 추가되어서 클릭하면 그에 해당하는 객체들만 보여진다.

class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields': ['question_text']}),
("Date Information", {'fields': ['pub_date'], 'classes': ['collapse']}), # fields는 입력받는 데이터, classes는 속성
]
inlines = [ChoiceInline] # 함께 입력받을 모델
list_display = ('question_text', 'pub_date', 'was_published_recently') # 객체내용으로 보여질 내용
list_filter = ['pub_date'] # 필터창 추가
admin.site.register(Question, QuestionAdmin)

9. 검색기능추가

- QuestionAdmin클래스에 search_fields를 추가하여 여기에 속성값을 주면 아래와 같은 디자인을 사용할 수 있음.

- 위 라인에 지정한 속성을 검색할 수 있는 창이 생긴다.

class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields': ['question_text']}),
("Date Information", {'fields': ['pub_date'], 'classes': ['collapse']}), # fields는 입력받는 데이터, classes는 속성
]
inlines = [ChoiceInline] # 함께 입력받을 모델
list_display = ('question_text', 'pub_date', 'was_published_recently') # 객체내용으로 보여질 내용
list_filter = ['pub_date'] # 필터창 추가
search_fields = ['question_text'] # 검색창 추가
admin.site.register(Question, QuestionAdmin)


반응형
Comments