21

私は単純なMyUserクラスを持っていPermissionsMixinます。スーパーユーザーに対してのみuser.is_superuser等しい。True私は私のでこれに似たことができるようにしたいと思いますadmin.py:

    if request.user.is_superuser:
        fieldsets = (
            (None, {'fields': ('email', 'password')}),
            ('Permissions', {'fields': ('is_admin','is_staff')}),
            ('Place', {'fields': ('place',)}),
            ('Important dates', {'fields': ('last_login',)}),
        )
    else:
        fieldsets = (
            (None, {'fields': ('email', 'password')}),
            #('Permissions', {'fields': ('is_admin','is_staff')}),
            ('Place', {'fields': ('place',)}),
            ('Important dates', {'fields': ('last_login',)}),
        )

基本的に、ユーザーが他のユーザーを作成できるようにしたいが、管理者やスタッフのアクセス許可を与えないようにしたい. これを実行できるのはスーパーユーザーだけです。

4

6 に答える 6

19

受け入れられた答えは近いですが、他の人が指摘するように、管理モデルの同じインスタンスで get_form が複数回呼び出され、インスタンスが再利用されるため、フィールドが繰り返されたり、self.fields が変更された後に他のユーザーがフィールドを表示したりする可能性があります。Django <=1.6 でこれを試してください:

class MyAdmin(admin.ModelAdmin):

    normaluser_fields = ['field1','field2']
    superuser_fields = ['special_field1','special_field2']

    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_superuser:
            self.fields = self.normaluser_fields + self.superuser_fields
        else:
            self.fields = self.normaluser_fields

        return super(MyAdmin, self).get_form(request, obj, **kwargs)

Django 1.7 では、オーバーライドできる get_fields() メソッドが導入されているようです。これは、より優れたアプローチです。

https://github.com/django/django/blob/d450af8a2687ca2e90a8790eb567f9a25ebce8​​5b/django/contrib/admin/options.py#L276

于 2014-07-30T00:01:17.170 に答える
18

私があなたを正しく理解していれば、あなたがしたいことは、ModelAdmin の get_form メソッドをオーバーライドすることです。django documentation の例に基づいて、次のようになります。

class MyUserAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        self.exclude = []
        if not request.user.is_superuser:
            self.exclude.append('Permissions') #here!
        return super(MyUserAdmin, self).get_form(request, obj, **kwargs)

少しハックして、save メソッドもオーバーライドする必要があるかもしれません。少し前に似たようなことをしましたが、それほど複雑ではありません (そしてドキュメントは素晴らしいです)。

もっと簡単な解決策があるかもしれませんが、あなたの質問は一般的なものであり、ユーザーモデルを共有していないため、これを解決する方法を正確に伝えることはできません. これが役立つことを願っています!

于 2013-10-06T08:27:01.763 に答える