슈코딩

[Django] Admin 페이지 커스텀 본문

코딩공부/Django

[Django] Admin 페이지 커스텀

Roshu 2022. 6. 24. 01:02

 

오늘은 Django에서 기본으로 제공하는 Admin페이지를 커스텀해서 더 활용도가 높게 바꿔주는 법에 대해서

기록하려고 한다.  이번 DRF특강때 배운내용인데, Admin페이지를 꾸밀수있다는게 신기했고 나중에도 활용을 하기 위해서 정리를 해본다. 우선 코드부터 보면, user APP의 admin.py 에 이런식으로 작성을 했다.

사용 방법은 TabulaInline과 StackedInline 모두 동일 / 스택은 세로로 표시 , 타불라는 가로로 표시 
# class UserProfileInline(admin.TabulaInline):
class UserProfileInline(admin.StackedInline):
    model = UserProfileModel

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == 'hobby':
            kwargs['queryset'] = HobbyModel.objects.filter(id__lte=7)

        return super().formfield_for_foreignkey(db_field, request, **kwargs)

유저의 프로필 모델인데 기존에는 테이블이 따로 있었었는데, UserProfileInline이라는 클래스를 선언해서 인자값에

StackedInline 또는 TabulaInline을 넣는다. 이것에 대한 역할은 코드블럭안에 적어놨다. 

 

class UserAdmin(BaseUserAdmin):
    list_display = ('id', 'username', 'fullname', 'email',) #object 목록에 띄워줄 필드를 지정한다.
    list_display_links = ('username',) object #목록에서 클릭 시 상세 페이지로 들어갈 수 있는 필드를 지정한다.
    list_filter = ('username',) #filter를 걸 수 있는 필드를 생성한다.
    search_fields = ('username', 'email',) #검색에 사용될 필드를 지정한다.
    #fieldsets 상세페이지에서 필드를 분류하는데 사용된다.
    fieldsets = (
        ("info", {'fields': ('username', 'password', 'email', 'fullname', 'join_date',)}), 
        ('Permissions', {'fields': ('is_admin', 'is_active',)}),)
    
    filter_horizontal = []
    
    #readonly_fields 읽기 전용 필드를 설정할 때 사용된다.
    def get_readonly_fields(self, request, obj=None):
    
        if obj:
            return ('username', 'join_date',)
        else:
            return ('join_date',)
   #UserProfile모델에 관한 것을 Admin페이지 User테이블안에 같이 저장     
    inlines = (
        UserProfileInline,
        )

UserAdmin에도 다양한 옵션들을 추가해주고, 내가 원하는 필드만 지정하거나, 필터를 걸거나 분류하거나, OnetoOne같은

관계에 있는 다른 테이블의 정보를 한번에 보여준다거나 이런식으로 커스텀이 가능하다.

admin.site.register(UserModel, UserAdmin)
admin.site.register(HobbyModel)

마지막에 이렇게 register해주게 되면 기본적인 커스텀이 끝나게 된다.

 

인상깊었던 점은 password에 따로 무언가 지정을 해주지 않았는데도, Django가 알아서 비밀번호를 해쉬해서 저장할 수 있는 기능이 생긴다는 점이다. 커스텀 전에는 그냥 비밀번호가 그대로 보여졌었는데 수정을 하니 위 이미지 처럼 변경이 되어있는 모습을 볼 수 있다. 그리고 수정을 하게되면 자동으로 정규표현식이 들어가서 1234같은 비밀번호는 설정 못하게 막아져 있다. 

이렇게 Django가 제공해주는 다양한 기능들에 편리함을 느꼈고, Django로 활용할 수 있는 기능들을 더 알아보고 싶다는 생각이 들게 되었다. 

Comments