[Django] 관리자 페이지에 모델 action 추가.

django 관리자 페이지에 모델 action 추가.

특정 모델의 기본 action 은 아래 그림처럼 삭제가 기본이다. (django import-export를 설치했기 때문에 export action이 더 보인다).

여기에 내가 원하는 action을 추가하고싶다면 다음과 같이 처리해야한다.

1. app/models.py 의 모델이 아래와 같다.

class NetworkDevice(models.Model):
    dev_ip = models.GenericIPAddressField(default='0.0.0.0', verbose_name='Network Device IP Address')
    dev_nip = models.BigIntegerField(blank=True, null=True, verbose_name='Numeric IP')
    username = models.CharField(max_length=24, verbose_name='UserName')
    password = encrypt(models.CharField(max_length=50, verbose_name='Password'))
    protocol = models.CharField(max_length=10, choices=protocols, verbose_name='Connection Protocol')
    platform = models.CharField(max_length=16, null=True, blank=True, verbose_name='Platform')
    port = models.CharField(max_length=5, verbose_name='Port number')
    vendor = models.CharField(max_length=32, verbose_name='Vendors')
    isl3 = models.BooleanField(default=False, verbose_name='L3')
    hostname = models.CharField(max_length=64, null=True, blank=True, verbose_name='Hostname')
    collect = models.BooleanField(default=False, verbose_name='Collect Data')
    uplink = models.TextField(null=True, blank=True, verbose_name='UP Link port list')
    model_number = models.CharField(max_length=32, null=True, blank=True, verbose_name='Model')

    category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.CASCADE, verbose_name='Category')

    class Meta:
        verbose_name_plural = 'Basic Device Information.'

2. app/admin.py에 필요한 action을 등록한다.

from import_export.admin import ImportExportActionModelAdmin
from .models import NetworkDevice

class NetworkDeviceAdmin(ImportExportActionModelAdmin):
    resource_class = NetworkDeviceResource
    list_display = [
        'dev_ip',
        'username',
        'platform',
        'protocol',
        'vendor',
        'hostname',
        'isl3',
        'collect',
        'category',
        'model_number',
    ]
    search_fields = ['dev_ip', 'hostname', 'platform', 'category__name', 'model_number']

여기에 custom_actions 리스트에 메소드 이름을 등록한다.

    custom_actions = [
        'test1', 
        'test2',
    ]

이제, test1, test2가 실행할 메소드를 작성한다.

아래 코드는 실제로는 아무것도 하지 않고, action이 끝나면 테스트1 실행이라는 메시지를 브라우저에 표시하는 기능만을 한다.

    @admin.action(description='테스트1')
    def test1(self, request, queryset):
        self.message_user(request, '테스트1 실행')

    @admin.action(description='테스트2')
    def test2(self, request, queryset):
        self.message_user(request, '테스트2 실행')

여기까지 작성해도 실제 페이지에는 적용되지 않는다. 아래 내용을 추가하여 페이지에 action이 나타나도록 한다.

    actions = custom_actions

테스트1 action을 실행한 결과는 아래 그림과 같다.

작성한 admin.py 코드는 아래와 같다.

from import_export.admin import ImportExportActionModelAdmin
from .models import NetworkDevice

class NetworkDeviceAdmin(ImportExportActionModelAdmin):
    resource_class = NetworkDeviceResource
    list_display = [
        'dev_ip',
        'username',
        'platform',
        'protocol',
        'vendor',
        'hostname',
        'isl3',
        'collect',
        'category',
        'model_number',
    ]
    search_fields = ['dev_ip', 'hostname', 'platform', 'category__name', 'model_number']

    custom_actions = [
        'test1', 
        'test2',
    ]

    @admin.action(description='테스트1')
    def test1(self, request, queryset):
        self.message_user(request, '테스트1 실행')

    @admin.action(description='테스트2')
    def test2(self, request, queryset):
        self.message_user(request, '테스트2 실행')

    actions = custom_actions

답글 남기기

Your email address will not be published.