2012-06-01 33 views
7

私が取り組んでいるDjangoサイトは、ユーザーがアカウントにサインアップする可能性があります。それらにいくつかの編集機能を提供するために、私は組み込みのDjango管理者を使用します。しかし、私は問題を抱えています:ユーザがサインアップした後、Django管理者の権限がなく、表示権限さえありません。したがって、私の質問:管理者のユーザーを編集するときに、「ユーザー権限」セクションで手動で割り当てることができるのと同じ方法で、関連するモデルの管理者権限をユーザーに割り当てる方法を教えてください。私はすでに、usualhas_xxx_permissions()のカスタムModelAdminクラスを使って試してみましたが、うまくいきませんでした。だから私の推測は、私は何かを見落としたことです。何か案は?あなたの目的のためにプログラムでDjangoの管理者権限を設定する

+0

関連する回答[こちら](http://stackoverflow.com/questions/10131271/invalid-literal-error-when-adding-a-user-permission-to-a-django-user-object/10131510#10131510) )と[ここ](http://stackoverflow.com/questions/10252332/how-to-add-permissions-in-django-to-models-and-test-it-using-the-shell/10252613#10252613) 。 – dgel

+0

パーフェクト - 私を正しい方向に向ける。どうもありがとうございました! – Timo

答えて

5

、それはおそらく、特定のグループにすべての新しいユーザーを割り当てて、そのグループにユーザーが必要とするすべての権限を与えるためにはるかに簡単で、かつ効率的です。グループのどのメンバーもこれらの権限を継承します。

グループ内でグループを作成し、そのグループに権限を割り当てることができます。次に、登録コードに次のようなものを追加するだけです。

try: 
    group = Group.objects.get(name='The User Group') 
except Group.DoesNotExist: 
    # group should exist, but this is just for safety's sake, it case the improbable should happen 
    pass 
else: 
    user.groups.add(group) 
+0

私はこれをこのようにすることができると思いますが、ユーザーに直接アクセス許可を適用することは、私にとっては「よかった」ようです(おそらく味の問題です)。しかし、他のユースケースについては、これを念頭に置いておきます。 – Timo

+0

@Timo私はまったく同じです。理論的にはグループがよりエレガントであるにもかかわらず、それが確実であることを確認するもう一つのことです。私はこのようなことをもっとやる必要があるとき、私はグループに切り替えるつもりだと思っていますが、今のところ私はダイレクトパーマに固執します。 –

+0

実際、dgelのコードサンプル([下](http://stackoverflow.com/a/10863809/61938)にリンクされています)が私の心を変えました。それはグループです! –

3

dgelの答えは私のための実用的なソリューションにつながる方向に私を指摘しました。基本的に、彼が何を示唆しているように見えることである:

  1. アクセス許可を設定するモデルのContentTypeを取得します。このコンテキストでは、コンテンツタイプはinformation about a Django modelを保持するオブジェクトです。
  2. Permission.objects.get()を使用して、コンテンツタイプと管理者が許可する操作で構成されるPermissionオブジェクトを作成します。唯一の難点は、codenameパラメータを調べることです。このパラメータは、管理者権限では、アクション(「追加」、「変更」または「削除」)、アンダースコア、およびモデル名で構成されます。したがって、Fooというモデルがあり、すべてのアクセス許可を作成する場合は、モデルのコンテンツタイプにadd_foo,change_foo、およびdelete_fooというコード名を加えた3つのアクセス許可が必要です。
  3. user.user_permissions.add(permission)を使用してこれらのアクセス許可を割り当てます。

codeexamplesのdgelの回答に向かいます。既存のDjangoデータベースのauth app(manage.py dumpdata auth)のデータダンプを見ると、権限の内部動作についての洞察も得られました。ジャンゴ1.6のよう

1

すべてのユーザーが許可に多対多のフィールドuser_permissionsを持っている - あなたはこれに権限を追加することができます

your_user.user_permissions.add(permission) 

V1。6つのドキュメント:私はこれを見つけたので、

0

(ユーザー、グループ、およびPermissionオブジェクトを示して)私は正確にあなたの質問にお答えしますGoogleに質問する私はDjango 1.9で何をやっているのかをグループで示してから、それをユーザに行う方法を示します。 django.contrib.auth.modelsから

は、グループ、パーミッション グループを、インポート__ = Group.objects.get_or_create(名= 'my_group')

permissions = Permission.objects.all() 
for p in permissions: 
    group.permissions.add(p) 
group.save() 

それは、ユーザに適応するために非常に簡単です:

from django.contrib.auth.models import Permission 
permissions = Permission.objects.all() 
for p in permissions: 
    youruser.user_permissions.add(p) 
youruser.save() 

今後の権限を追加する可能性があり、すべてのユーザーを再実行する代わりにグループに追加するだけでよいので、私はグループを優先します。

関連する問題