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")