8

ユーザー編集ページで権限リストを変更する可能性はありますか? 管理者ログ エントリや認証グループなどのすべてのアクセス許可を表示したくありません。メインのクエリセットを変更して一部を除外するにはどうすればよいですか?

4

2 に答える 2

11

このトピックからアイデアを得ました、これもあなたの質問に答えますが、それほど明確ではありません。

視覚化に使用される UserAdmin フォームで、ユーザー権限のクエリセットを上書きする必要があります。

これを行う最も簡単な方法は、UserAdmin のサブクラスを作成し、get_formメソッドを上書きすることです。

from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin

class MyUserAdmin(UserAdmin):
    def get_form(self, request, obj=None, **kwargs):
        # Get form from original UserAdmin.
        form = super(MyUserAdmin, self).get_form(request, obj, **kwargs)
        if 'user_permissions' in form.base_fields:
            permissions = form.base_fields['user_permissions']
            permissions.queryset = permissions.queryset.filter(content_type__name='log entry')
        return form

クエリセットのフィルターは、必要に応じて変更できます。例:

# Exclude admin and auth.    
permissions.queryset = permissions.queryset.exclude(content_type__app_label__in=['admin', 'auth'])

# Only view permissions of desired models (Can be your models or Django's)
permissions.queryset = permissions.queryset.filter(content_type__model__in=['blog', 'post', 'user', 'group'])

クラスを作成したら、ユーザー モデルを新しく作成した管理者に登録する必要があります。

admin.site.unregister(User)  # You must unregister first
admin.site.register(User, MyUserAdmin)

編集: このコードにより、新しいユーザーの作成時に django がクラッシュしたため、Maik Hoepfel からのコメントを追加しました。


グループ編集ページの権限リストで同じことを行うことができますが、GroupAdmin から拡張された別の管理者を作成し、変更form.base_fields['user_permissions']する必要がありますform.base_fields['permissions']

于 2011-11-14T17:41:27.077 に答える
4

レナートの答えはほぼ完璧です。Django 管理者は、ユーザーの追加を同じフォームで 2 ステップのプロセスにし、彼のコードは最初のステップで「user_permissions」の KeyError で失敗します。

修正は簡単です。代わりに以下のコードを使用してください。

def get_form(self, request, obj=None, **kwargs):
    form = super(MyUserAdmin, self).get_form(request, obj, **kwargs)
    # adding a User via the Admin doesn't include the permissions at first
    if 'user_permissions' in form.base_fields:
        permissions = form.base_fields['user_permissions']
        permissions.queryset = permissions.queryset.filter(content_type__name='log entry')
    return form
于 2012-07-18T14:21:00.037 に答える