2011-12-08 5 views
0

私はdjango adminを使用してフォームを生成し、データベースにいくつかのデータを組み込みましたが、ユーザグループに応じて特定のフォームフィールドを非表示にする必要があります。django admin filter change_listユーザグループに応じたフィールド

私はグループのユーザーをしたい
class Product(models.Model): 
    name = models.CharField(...) 
    description = models.CharField(...) 
    approved = models.CharField(max_length=1, choices=(('y', 'yes'), ('n','no'), ('w', 'waiting')) 

「基本」形式のみ「名前」と「説明」とユーザーの中で参照してください。

それでは、私のようなモデルをしたとしましょうグループ「上級」も「承認済み」のステータスを参照してください。

カスタマイズしたテンプレートを使用する必要がありますか? はいかいいえかどうかに関わらず、いくつかのドキュメントや例を参考にしてください。

ありがとうございます。

答えて

2

ProductAdminクラスのget_formメソッドをオーバーライドできます。元のメソッドから:

def get_form(self, request, obj=None, **kwargs): 
    .... 
    .... 
    defaults = { 
     "form": self.form, 
     "fields": fields, 
     "exclude": exclude, 
     "formfield_callback": curry(self.formfield_for_dbfield, request=request), 
    } 
    defaults.update(kwargs) 
    ... 

は、だから、動的どちらかself.formまたはフィールドを変更したり、あなたが唯一の特定のフィールドを非表示にしたい場合は、まだ変更を可能にしながら、最小限のソリューションを追加するかもしれない、

+0

このレポートをありがとう、私は医者の詳細を調べるつもりです! –

1

あなたのフォームに__init__メソッドを提供できます。ここでは、ユーザオブジェクトがある場合はそのオブジェクトにアクセスできます。チームメンバーシップに基づいて、フォームをカスタマイズすることができます。

一部抜粋:

関数のシグネチャとユーザーオブジェクトの取得:ユーザーがグループ内にあるかどうかを確認する

def __init__(self,*args, **kwargs):  
     self.user=None 
     if kwargs: 
      self.user = kwargs.pop('user') 

機能:

def is_user_in_group(user,group_name): 
    return user.groups.filter(name=group_name).count() == 1 

スニペットフィールドを隠し作るために - これはあなたの__init__メソッドに入ります:

self.fields['some_field_to_hide'].widget = widgets.HiddenInput 

私はここから思い出に行くので、誤解をおかけください。

+0

のthnx、非常に参考に説明:) –

0

を除外することができますadminユーザーを新しいグループに追加し、グループメンバーシップに基づいてフィールドを減らします。ここにドロップインする再利用可能なクラスです:

class ExternalAdminModelAdmin(admin.ModelAdmin): 
    external_admin_group = 'external_admin' 
    hidden_fields = [] 

    def get_form(self, request, obj=None, **kwargs): 
     self.fields = [field.name for field in Node._meta.local_concrete_fields if not field.name == 'id'] 

     if Group.objects.get(name=self.external_admin_group).user_set.filter(id=request.user.id).exists(): 
      for field_name in self.hidden_fields: 
       self.fields.remove(field_name) 

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

あなただけのモデルのための隠しフィールドのプロパティを設定する必要があります。

@admin.register(MyModel) 
class MyAdmin(ExternalAdminModelAdmin): 
    hidden_fields = ['sensitive_field'] 
関連する問題