Django/Django Rest Framework

17. Django DRF admin 페이지 심화

S.T.Lee 2022. 6. 20. 15:45

기본 admin 상태로 하면 다음과 같이 비밀번호가 보안화 되지 않고 오는 것을 확인 할 수 있다.

이로 인해 로그인이 되지 않는 문제가 발생하는데 이를 수정할것이다.

from django.contrib import admin
from user.models import User as UserModel
from user.models import UserProfile as UserProfileModel
from user.models import Hobby as HobbyModel
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

# Register your models here.

class UserAdmin(BaseUserAdmin):
    list_display = ('id', 'username', 'fullname', 'email')
    list_display_links = ('username', )
    list_filter = ('username', )
    search_fields = ('username', 'email', )

    fieldsets = (
        ("info", {'fields': ('username', 'password', 'email', 'fullname', 'join_date',)}),
        ('Permissions', {'fields': ('is_admin', 'is_active', )}),)

    filter_horizontal = []

    def get_readonly_fields(self, request, obj=None):
        if obj: #이미 생성된 obj일때
            return ('username', 'join_date', )
        else: #obj 생성할 때 
            return ('join_date', )

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

다음과 같이 바뀐다.

 

한줄씩 보면

list_display = ('id', 'username', 'fullname')

list_display : object 목록에 띄어줄 필드를 지정한다.

list_display_links = ('username', )

list_display_links : object 목록에서 클릭 시 상세 페이지로 들어갈 수 있는 필드를 지정한다.

list_filter = ('name', )

list_filter :  filter를 걸 수 있는 필드를 생성한다.

search_fields = ('username', )

search_fields : 검색에 사용될 필드를 지정한다.

readonly_fields = ('username', 'join_date', )

readonly_fields : 상세페이지에서 읽기 전용 필드를 설정할 때 사용한다. join_date와 같이 auto_now_add = True로 되어 있으면 무조건 설정해줘야한다.

fieldsets = (
        ("info", {'fields': ('username', 'fullname', 'join_date')}),
        ('permissions', {'fields': ('is_admin', 'is_active', )}),
    )

fieldsets : 상세페이지에서 필드를 분류하는데 사용한다. (카테고리, {카테고리에 들어갈 테이블})

filter_horizontal = ['hobby']

filter_horizontal : ManyToManyField에서 좌우로 선택할 수 있다.

 

Inline(Tubulainline / Stackinline) 설정(역참조 관계에서만 가능하다.)

from django.contrib import admin
from user.models import User as UserModel
from user.models import UserProfile as UserProfileModel
from user.models import Hobby as HobbyModel
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

# Register your models here.
class UserProfileInline(admin.StackedInline):
    model = UserProfileModel


class UserAdmin(BaseUserAdmin):
	"""
    ...
    """
    inlines = (
        UserProfileInline,
    )
    
admin.site.register(UserModel, UserAdmin)

이렇게 하면 Admin/User에 UserProfile을 추가할 수 있다.

Tubulainline / Stackinline의 차이는 가로/세로로 띄어주는 것이다.

 

추가/삭제/수정 권한 설정

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

class UserAdmin(BaseUserAdmin):
    def has_add_permission(self, request, obj=None): # 추가 권한
        return False

    def has_delete_permission(self, request, obj=None): # 삭제 권한
        return False

    def has_change_permission(self, request, obj=None): # 수정 권한
        return False

admin.site.register(UserModel, UserAdmin)

이대로 넣으면 로그인된 유저에 대해 ADD USER +, + ADD가 없어지고 read_only field로 바뀐걸 알 수 있다.

전 / 후

return위에 어떤 유저에 대해 할지 설정해주면 된다.