본문 바로가기
  • 실행력이 모든걸 결정한다
Django

[Django] Admin 사이트 커스터마이징

by 김코더 김주역 2023. 1. 22.
반응형

1. 테이블 양식 변경

1) ModelAdmin

- 테이블의 양식을 변경하려면 ModelAdmin 클래스를 상속받아 새로운 모델 관리 클래스를 만들어서 적용하면 된다.

- 예를 들어, Comment 테이블의 양식을 변경하고 싶다면 다음과 같이 작성한다.

# admin.py
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    ...

※ 기본 양식을 따르려면 단순히 아래와 같이 admin 사이트에 등록만 해주면 된다.

# admin.py
admin.site.register(Comment)

 

 

2) 레코드 리스트에 보여줄 필드 지정

- 다음과 같이 Comment 모델이 정의되어 있다고 하자.

class Comment(models.Model):
    post=models.ForeignKey(Post, on_delete=models.CASCADE, blank=True, null=True)
    content=models.TextField('CONTENT')
    create_dt=models.DateTimeField('CREATE DT', auto_now_add=True)
    update_dt=models.DateTimeField('UPDATE DT', auto_now=True)
    
    @property # 메소드의 반환값을 필드로 정의
    def short_content(self):
        return self.content[:10]
    
    def __str__(self):
        return self.short_content

표시할 필드와 그 순서를 임의로 지정하고 싶다면 아래와 같이 list_display 속성을 이용하면 된다.

# admin.py
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    list_display=('id', 'post', 'short_content', 'create_dt', 'update_dt')

지정한 순서대로 잘 표시되었다.

 

 

3) 필드 분리

- 필드를 분리해서 보여주고 싶으면 fieldsets 속성을 이용하면 된다. 만약 Category 모델에 name, description 필드가 정의되어 있다고 하면 다음과 같이 분리할 수 있다.

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    fieldsets=[
        ('Info', {'fields':['name']}),
        ('Date', {'fields':['description']}),
    ]

※ 자동으로 생성되는 필드나 변경 불가능한 필드는 사용할 수 없다.

 

그리고 classes 속성에 'collapse'를 추가하면 해당 부분을 접을 수 있다. Show를 누르면 필드들이 모두 표시된다.

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    fieldsets=[
        ('Info', {'fields':['name']}),
        ('Date', {'fields':['description'], 'classes':['collapse']}),
    ]

 

 

4) 외래키 관계의 두 테이블을 한 화면에서 변경하기

- 외래키 관계의 두 테이블인 Post와 Comment가 있다고 하자. N:1에서 N은 Comment고, 1은 Post다. N 테이블에 대한 인라인 클래스를 생성해서 1 테이블의 inlines 속성에 추가해주면 된다.

class CommentInline(admin.StackedInline):
    model=Comment
    extra=3 # 한 번에 몇 개의 Add칸을 표시할 것인가 (admin에서 따로 추가 및 삭제 가능)

@admin.register(Post) # Post 테이블을 admin 사이트에 등록
class PostAdmin(admin.ModelAdmin):
    list_display=('id', 'category', 'tag_list', 'title', 'description', 'image','create_dt','update_dt','like')
    inlines=[CommentInline]
    ...

Post Add/Change 페이지에서도 Comment를 추가/변경할 수 있게 되었다.

인라인 클래스가 admin.StackedInline가 아닌 admin.TabularInline을 상속받으면 다음과 같이 테이블 형식으로 나타난다.

 

 

5) list_filter

- UI 화면 우측에 필터 사이드 바를 붙일 수 있도록 하는 속성이다.

- 필터에 사용된 기준 타입에 따라, 자동으로 적절한 항목들을 보여준다. 예를 들어, DateTimeField 타입은 아래와 같이 나타난다.

update_dt=models.DateTimeField('UPDATE DT', auto_now=True)

 

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display=('id', 'category', 'tag_list', 'title', 'description', 'image','create_dt','update_dt','like')
    list_filter=['update_dt']
    ...

 

 

6) search_fields

- 검색 박스를 추가할 수 있도록 하는 속성이다. 검색 박스에 단어를 입력하면 LIKE 쿼리로 해당 필드를 검색한다. 여러 개의 필드를 지정할 수도 있다.

@admin.register(Post) # Post 테이블을 admin 사이트에 등록
class PostAdmin(admin.ModelAdmin):
    list_display=('id', 'category', 'tag_list', 'title', 'description', 'image','create_dt','update_dt','like')
    search_fields=['title'] # title 필드를 기준으로 검색
    ...

 

 

 

2. Admin 사이트 템플릿 적용

- Admin 사이트도 장고의 템플릿 시스템을 사용하고 있기 때문에, Admin 사이트에 적용되는 템플릿 파일을 개발자가 원하는 대로 바꿀 수도 있다.

- django/contrib/admin/templates/admin 디렉토리를 보면 Admin 사이트에 기본적으로 사용되는 html 파일들을 확인할 수 있다.

직접 만든 템플릿을 적용하려면, 프로젝트 루트에 templates/admin 디렉토리를 만든 뒤에 파일의 이름을 동일하게 해서 이 디렉토리에 추가하면 된다.

 

 

참고할 만한 자료 : https://docs.djangoproject.com/en/4.1/ref/contrib/admin/

반응형

댓글