5

さまざまな権限を持つユーザーがさまざまなことを実行できるようにするモデルの動的フォームを作成しようとしています。以下のコードが正しく機能し、スーパーユーザー以外のユーザーが「Merchant」ブロックのどのフィールドも編集できないようにする必要があります。

class CategoryModelAdmin(LWModelAdmin):
    fieldsets = (
        ('Merchant', {'fields': ('merchant',) }),
        ('Category', { 'fields': ('name', 'parent',) }),
    )
    def get_form(self,request,obj=None, **kwargs): 
        if request.user.is_superuser:
            self.exclude = []
        else:
            self.exclude = ['Merchant']
        return super(CategoryModelAdmin,self).get_form(request, obj=None, **kwargs)

以下のコードでその効果を達成することができますが、私はそれを行うための「正しい」方法を本当に探しています。excludeを使用するのが正しい方法のように感じますが、何があっても正しく理解できないようです。やってみます。

class CategoryModelAdmin(LWModelAdmin):
    declared_fieldsets = None
    admin_fieldsets = (
        (None, {'fields': ('merchant',) }),
        ('Category', { 'fields': ('name', 'parent',) }),
    )
    restricted_fieldsets = (
        ('Category', { 'fields': ('name', 'parent',) }),
    )

    def get_fieldsets(self, request, obj=None):
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets
        else:
            fieldsets = self.restricted_fieldsets
        return LWModelAdmin.fieldsets + fieldsets

    def get_form(self, request, obj=None, **kwargs):
        self.declared_fieldsets = self.get_fieldsets(request, obj)
        return super(self.__class__, self).get_form(request, obj)
4

2 に答える 2

3

コードはスレッドセーフではありませんself.exclude。カスタムModelAdminメソッドでself(など)に属性を設定しないでください。ModelAdmin.get_form代わりに、とのkwargsを使用InlineModelAdmin.get_formsetして、必要なものを取得してください。

簡単な例を次に示します。

class CategoryModelAdmin(LWModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_superuser:
            kwargs['exclude'] = ['foo', 'bar',]
        else:
            kwargs['fields'] = ['foo',]
        return super(CategoryModelAdmin, self).get_form(request, obj, **kwargs)
于 2011-07-22T07:07:44.053 に答える
1

これが多かれ少なかれハックになるかどうかはわかりませんが、これを検討しましたか?

同じテーブルを指す2つの異なるモデルを作成します。各モデルは、必要な設定で独自のModelAdminクラスを持つことができます。次に、Djangoの権限を使用して、そのうちの1つを管理者以外の人には見えないようにします。

コードの重複を避けたい場合は、作成したいくつかの共通ベースクラスから両方のクラスを派生させることができます。

利点は、ドキュメントに記載されている以外のことを何もしないことです。get_formやのようなメソッドを上書きすることを意図しているとは思いませんget_fieldsets。それらが実際に公開されたAPIの一部でない場合、それらのメソッドは変更されるか、日に削除される可能性があり、アップグレードで所有される可能性があります。

ちょっとした考え...

于 2011-07-22T03:13:02.720 に答える