TIL(Today I Learned)
6월 26일 TIL - 장고 어드민 커스터마이징
Hyerin P.
2023. 6. 26. 21:15
▷ 오늘의 배움
📖 Django Admin Customizing
✏️ ModelAdmin options
- list_display : Admin 목록에 보여질 필드 목록
- list_display_links : 목록 내에서 링크로 지정할 필드 목록 (이를 지정하지 않으면, 첫번째 필드에만 링크가 적용)
- list_editable : 목록 상에서 수정할 필드 목록
- list_per_page : 페이지 별로 보여질 최대 갯수 (디폴트 : 100)
- list_filter : 필터 옵션을 제공할 필드 목록
- actions : 목록에서 수행할 action 목록
✏️ 커스터마이징 예시
class EmoticonAdmin(admin.ModelAdmin):
# 오브젝트 상세페이지에서 보여질 필드
fields = ("creator", "title", "created_at", "updated_at", "db_status")
# 목록에서 보여질 필드
list_display = ("creator", "title", "created_at", "updated_at", "db_status")
# 수정 불가능한 필드
readonly_fields = ("created_at", "updated_at")
# 목록에서 상세페이지로 넘어갈때 링크로 지정할 필드
list_display_links = ["creator", "title"]
# 목록들을 볼 때 필터 옵션 필드
list_filter = [
"db_status",
"created_at",
]
# 페이지별로 보여질 오브젝트 갯수
list_per_page = 10
# 목록에서 수행할 action 목록, 기본적으로 삭제하는 액션이 설정되어있다.
actions = ["make_sale", "make_stop_selling", "make_delete"]
# admin action 추가
def make_sale(self, request, queryset):
updated_count = queryset.update(db_status=1) # queryset.update
self.message_user(
request, "{}건의 항목을 판매중 상태로 변경".format(updated_count)
) # django message framework 활용
make_sale.short_description = "지정 항목을 판매중 상태로 변경"
def make_stop_selling(self, request, queryset):
updated_count = queryset.update(db_status=2) # queryset.update
self.message_user(
request, "{}건의 항목을 판매중지 상태로 변경".format(updated_count)
) # django message framework 활용
make_stop_selling.short_description = "지정 항목을 판매중지 상태로 변경"
def make_delete(self, request, queryset):
updated_count = queryset.update(db_status=3) # queryset.update
self.message_user(
request, "{}건의 항목을 신청삭제 상태로 변경".format(updated_count)
) # django message framework 활용
make_delete.short_description = "지정 항목을 신청삭제 상태로 변경"
💬 List 순서 그대로 중복 요소 제거하기
로케이션 리스트를 키 값으로 딕셔너리를 생성한다. 이 때 딕셔너리는 중복 키 값을 가지지 못함으로 자동으로 중복 요소가 제거된다. 그후 다시 list로 변환하여준다. set()을 이용하여 중복 제거를 진행 할 수 도 있지만 set()은 자동으로 순서가 정렬되기 때문에 순서가 중요하다면 딕셔너리를 이용한 방식이 더 적합하다.
for a in list(dict.fromkeys(location_list)):
article_list = a.article_set.filter(db_status=1).order_by("-created_at")