Django admin.ModelAdmin.has_delete_permission() サンプルコード集

2024-04-02

Django admin.ModelAdmin.has_delete_permission() 解説

概要

  • 以下の状況で呼び出されます。
    • オブジェクトの削除ビュー
    • 一括削除アクション
  • 引数:
    • request: 現在のリクエスト
    • obj: 削除対象のオブジェクト (省略可能)
  • 戻り値:
    • True: 削除権限あり
    • False: 削除権限なし

デフォルトの動作

デフォルトでは、has_delete_permission() は以下の条件に基づいて削除権限を判断します。

  1. request.user.is_superuser: リクエストユーザーがスーパーユーザーの場合、常に True を返します。
  2. ModelAdmin.has_module_permission(): モデルのモジュールに対する変更権限があるかどうかを確認します。
  3. obj が指定されている場合:
    • オブジェクトにカスタム delete_permission メソッドがある場合は、そのメソッドを呼び出して結果を返します。
    • カスタムメソッドがない場合は、ModelAdmin.delete_model() メソッドを呼び出して結果を返します。

カスタマイズ

has_delete_permission() メソッドをオーバーライドすることで、削除権限の判断ロジックをカスタマイズできます。

例:

class MyModelAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        # 独自のロジックを実装
        if obj is not None and obj.author == request.user:
            return True
        return False

補足

  • ModelAdmin.delete_model() メソッドは、オブジェクトの削除処理を実行します。


Django admin.ModelAdmin.has_delete_permission() サンプルコード

class MyModelAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        # 特定のユーザーのみ削除を許可
        if request.user.username == 'my_username':
            return True
        return False

オブジェクト作成者のみ削除を許可

class MyModelAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        # オブジェクト作成者のみ削除を許可
        if obj is not None and obj.created_by == request.user:
            return True
        return False

特定の条件を満たすオブジェクトのみ削除を許可

class MyModelAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        # 特定の条件を満たすオブジェクトのみ削除を許可
        if obj is not None and obj.status == 'approved':
            return True
        return False

カスタムロジック

class MyModelAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        # 独自のロジックを実装
        if obj is not None:
            # 外部 API と連携して削除可否を判断
            response = requests.get('https://api.example.com/objects/{}/delete_permission'.format(obj.id))
            if response.status_code == 200:
                return response.json()['hasPermission']
        return False

削除権限チェックを無効化

class MyModelAdmin(admin.ModelAdmin):
    def has_delete_permission(self, request, obj=None):
        # 削除権限チェックを無効化
        return True

注意

上記サンプルコードはあくまでも例です。実際のユースケースに合わせてカスタマイズする必要があります。



Django admin.ModelAdmin.has_delete_permission() 以外の方法

ModelAdmin.actions 属性を使用して、カスタム削除アクションを作成できます。

例:

class MyModelAdmin(admin.ModelAdmin):
    actions = ['my_delete_action']

    def my_delete_action(self, request, queryset):
        # 独自の削除処理を実装
        for obj in queryset:
            # ...

ModelAdmin.delete_view() メソッドをオーバーライドして、削除ビューのカスタマイズできます。

例:

class MyModelAdmin(admin.ModelAdmin):
    def delete_view(self, request, object_id):
        # 独自の削除処理を実装
        obj = self.get_object(request, object_id)
        # ...

パーミッション

Django のパーミッションシステムを使用して、削除権限を制御できます。

カスタムロジック

上記のいずれの方法も適切でない場合は、独自のロジックを実装する必要があります。

要件に応じて適切な方法を選択する必要があります。

  • 简单的な要件であれば、ModelAdmin.has_delete_permission() メソッドをオーバーライドするだけで十分です。
  • より複雑な要件の場合は、ModelAdmin.actionsModelAdmin.delete_view() メソッドをオーバーライドする必要があります。
  • 非常に複雑な要件の場合は、独自のロジックを実装する必要があります。