Django

Django admin 페이지 커스텀하기

끈끈 2023. 5. 23. 09:19

 

기본 예시

 

user > admin.py:

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

from user.models import User

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:
            return ('username', 'join_date', )
        else:
            return ('join_date', )
        
admin.site.register(User, UserAdmin)

 

User model과 맞춰서 수정하기

 

아래는 각 기능에 대한 설명

 

 

# 예시
filter_horizontal = ['hobby'] # ManyToMany에서 사용

 

filter_horizontal

 

BaseUserAdmin

 

admin.py

 

# 추가
ordering = ['id']

 

# 생성 / 수정 모두 readonly로 설정
# 'join_date'는 non-edit / 'email'은 redonly하면 X
readonly_fields = ('join_date', )

# 생성 시 write 가능, 수정 시 readonly field로 설정
def get_readonly_fields(self, request, obj=None):
        if obj: # 특정 데이터를 볼 때
            return ('username', 'join_date', ) # readonly_fields로 설정
        else: # 특정 데이터가 없을 때, 즉 데이터를 생성할 때
            return ('join_date', ) # readonly_fields로 설정

 


 

migrate를 하다가 아래와 같은 에러가 난다면 링크 참고

 

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency user.0001_initial on database 'default'.

 


 

Groups 삭제

 

 

from django.contrib.auth.models import Group

admin.site.unregister(Group)

 

 


 

TabularInline / StackedInline

 

from user.models import User, UserProfile, Hobby

# 사용 방법은 TabulaInline과 StackedInline 모두 동일
# 둘 다 사용해보고 뭐가 좋은지 비교해보기
class UserProfileInline(admin.TabularInline):

class UserAdmin(admin.ModelAdmin):
    inlines = (
            UserProfileInline,
        )

admin.site.register(User, UserAdmin)

 

TabularInline

 

from user.models import User, UserProfile, Hobby

class UserProfileInline(admin.StackedInline):
    model = UserProfile

class UserAdmin(admin.ModelAdmin):
    inlines = (
            UserProfileInline,
        )

admin.site.register(User, UserAdmin)

 

StackedInline

 

'Django' 카테고리의 다른 글

drf filter __ 언더스코어  (4) 2023.06.14
drf swagger 문서화  (1) 2023.05.29
Django sqlite3 mysql로 변경하기  (11) 2023.05.09
DRF BooleanField  (2) 2023.04.25
POETRY 가상환경 설정하기  (8) 2023.04.24