본문 바로가기
Django

Django [관리자 페이지] action

by nyanguk 2021. 2. 2.

장고 관리자의 주요 목적은 데이터를 생성하거나, 수정 삭제하는 것이다. 그러나 조건에 해당하는 여러 데이터들을 수정,삭제 등 관리 할 필요가 있을때 데이터 하나 하나마다 적용하는 것은 매우 번거로운 일이다.

Ex) 장바구니에서 선택된 항목만 결제를 원할때 하나씩 결제를 하는 것은 번거롭다!

 

장고 관리자는 목록 페이지에서 선택된 개체의 목록에게 어떤 "작업"을 한꺼번에 요청 할 수 있고 이러한 "작업"을 구현하는 거은 action이 담당하게 된다.

 

이번 게시글에서는 user의 인증을 활성화 또는 비활성화 하는 "작업"을 추가 하고자 한다.

 

action 추가 하기

기본적으로 action 함수에는 세가지의 전달인자가 필요하다.

  • ModelAdmin - 현재의 modeladmin
  • HttpRequest - 현재요청을 나타내는 request
  • QuerySet - 사용자가 선택한 오브젝트의 세트 queryset

 

추가하고자 하는 액션은 선택된 사용자에게 인증을 해주는 것이다.

아래 코드 처럼 member의 모델에서는 사용자를 추가 할때  디폴트 인증상태는 False이고 인증일은 None이다

# Custom_admin/member/models.py
certification_date = models.DateField('인증일', default=None, null =True, blank =True)
is_certificated =models.BooleanField('인증상태',default=False)

 

작업 작성하기

그러므로 선택된 사용자에게 인증 상태를 True로 업데이트하고 인증일을 오늘 날자로 업데이트 하는 작업을 추가하자!

member의 admin.py에 action을 위한 함수를 만들자 

# Custom_admin/member/admin.py
from datetime import date

# action_1 사용자 인증하기
def certify_user(modeladmin, request ,queryset):
    queryset.update(is_certificated = True,certification_date =date.today())
    
certify_user.short_description = "선택된 사용자를 인증합니다."

앞서 이야기 한 것 처럼 action의 인자로 modeladmin, request ,queryset을 전달해야함을 잊지말자

queryset에 선택된 모든 사용자의 객체가 들어있으므로 그 안의 객체의 is_certificated  certification_date 의 값을 업데이트 해준다.

그리고 short_discription 속성을 이용하여 관리자 페이지의 action부분에서 사용자에게 보여질 문구를 수정하면 된다.

디폴트는 함수의 이름인 certify_user 이다.

이때 short_discription은 def 밖에서 이뤄져야 한다. (certify_user. 이므로 객체 내에서는 사용 불가능)

 

작업 추가하기 

action의 내용을 모두 구현 하였다면 목록페이지에 이 action 을 추가 해야한다. 아래와 같이 리스트의 한 요소로 넣어 주면 적용되는 것을 확인 할 수 있다. 

# Custom_admin/member/admin.py

class MemberAdmin(admin.ModelAdmin):
    actions = [certify_user]    # action 추가 
    ...

결과 

MemberAdmin에 action 추가 하기

동일한 코드를 위치만 살짝 바꿔보자 클래스 MemberAdmin 안에 action 함수를 넣을 수 있으며 actions에 전달 되는 값을 

certify_user이 아닌 'certify_user'으로 바꿔 주면 동일하게 동작되는 것을 확인 할 수 있다.

class MemberAdmin(admin.ModelAdmin):
    actions = ['certify_user']    # action 추가 
	.
	.
    .
    # action_1 사용자 인증하기
    def certify_user(self, request ,queryset):
        queryset.update(is_certificated = True,certification_date =date.today())

    certify_user.short_description = "선택된 사용자를 인증합니다."

 

message 추가하기

작업이 어떻게 처리되었는지 사용자에게 알리기 위해 message 를 사용한다.

message_user 사용법

message_user (
      request,
      message,
      level: int=20,
      extra_tags: str=str,
      fail_silently: bool=False
)

message_user(request, message)

message_user(request, message, level)

 

message_level 종류

  • messages.DEBUG
  • messages.INFO
  • messages.SUCCESS
  • messages.WARNING
  • messages.ERROR

이를 참고 하여 아래와 같이 추가해준다면 작업에 대한 결과를 사용자에게 알려줄 수 있다. 

    def certify_user(self, request ,queryset):
        update = queryset.update(is_certificated = True,certification_date =date.today())
        self.message_user(request,'{0} 명의 사용자가 성공적으로 인증 되었습니다.'.format(update), messages.SUCCESS)

 

만약 한번에 여러개의 값을 출력하고 싶다면 neggtext를 사용하자

결과

 

참고문서

https://docs.djangoproject.com/en/3.1/ref/contrib/messages/

https://docs.djangoproject.com/en/3.1/ref/contrib/admin/actions/

https://docs.djangoproject.com/en/3.1/topics/db/queries/#topics-db-queries-update