2011-07-21 6 views
4

私は、異なる権限を持つユーザーが異なることを行うことができるモデルの動的フォームを作成しようとしています。私が望むのは、以下のコードが適切に機能するため、非スーパーユーザーは 'Merchant'ブロックのフィールドを編集できないということです。Djangoフィールドセットで除外を使用する

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) 

私は以下のコードを経由してその効果を達成することができますが、私は実際にそれを行うには「正しい」方法を探していますし、除外する使用して移動するための方法ですが、私が見えることはできませんようにそれは感じています私が何を試みてもそれを正しく得るために。

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) 

答えて

3

あなたのコードはスレッドセーフではありません、あなたのカスタムModelAdminの方法で自己(self.excludeなど)の属性を設定するべきではありません。代わりに、ModelAdmin.get_formInlineModelAdmin.get_formsetのkwargsを使用して、必要なものを入手してください。ここで

は簡単な例です:

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) 
1

多かれ少なかれハッキングになるかどうかはわかりませんが、これを考慮していますか?

同じテーブルを指す2つの異なるモデルを作成します。各モデル には、自分が望む設定を持つModelAdminクラスがあります。 その後、Djangoの権限を使用して、非管理者 にそれらの1つを見えなくします。

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

利点は、ドキュメントに書かれている内容の外では何もしないことです。私たちは、get_formget_fieldsetsのような上書き方法であるとは思わない。公開APIの一部ではない場合、これらのメソッドは変更されるか、または日中に削除される可能性があり、アップグレードで所有することができます。ただ、思考

...

関連する問題