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