3

私は現在has_change_permission、カスタム django admin クラスのフックを利用して、単純な形式の行レベルのアクセス許可を実装し、非スーパーユーザーが特定のオブジェクトを編集できるかどうかを次のように判断しています。

def has_change_permission(self, request, obj=None):
        if obj is None or request.user.is_superuser or (obj and not obj.superuser_only): # (my model has a 'superuser_only' flag that gets set via fixtures, but its beyond the scope of this question) 
            return True
        return False

これは十分に機能します。すべてのオブジェクトがユーザーに表示されますが、編集権限のないオブジェクトをクリックすると、おそらく PermissionDenied が発生したため、403 ページに移動します。ただし、許可が拒否されたページへのハイパーリンクを提供することは、この場合には理想的ではないようです。オブジェクトを表示したいが、リスト ページの編集ページへのハイパーリンクを提供したくない (オブジェクトの URL を手動で使用しようとした場合に PermissionDenied を発生させることに加えて)。恐ろしいハックなしでこれらのハイパーリンクを削除するための簡単なフックはありますか? 私は経験豊富な django 開発者なので、正しい方向性 (存在する場合) を教えていただければ、詳細を実装するか、現時点では価値がないと判断できます。

4

1 に答える 1

1

ModelAdmin クラス (私の admin.py ファイル内) のデフォルトの get_list_display_links 関数を上書きすることで、かなり簡単な方法でこれを実現できました。

def get_list_display_links(self, request, list_display):
    if request.user.is_superuser:
        if self.list_display_links or not list_display:
            return self.list_display_links
        else:
            # Use only the first item in list_display as link
            return list(list_display)[:1]
    else:
        # Ensures that no hyperlinks appear in the change list for non-superusers
        self.list_display_links = (None, )
        return self.list_display_links

私のコードはスーパーユーザーのハイパーリンクを保持していることに注意してください。この区別をしたくない場合は、関数の後半部分を簡単に使用できます。

于 2014-09-09T02:44:12.077 に答える