私が取り組んでいる Django サイトには、ユーザーがアカウントにサインアップできる可能性があります。いくつかの編集機能を提供するために、組み込みの Django admin を使用します。ただし、問題があります。ユーザーがサインアップした後、Django admin 内でアクセス許可がなく、表示アクセス許可さえありません。したがって、私の質問:管理者でユーザーを編集するときに、「ユーザー権限」セクションで手動で割り当てることができるのと同じ方法で、関連するモデルのユーザーに管理者権限をコードで割り当てるにはどうすればよいですか? カスタムクラスを使用して通常どおり 試してみましたが、うまくいきませんでした。だから私の推測では、私は明らかな何かを見落としていたと思います。何か案は?has_xxx_permissions()
ModelAdmin
5 に答える
https://docs.djangoproject.com/en/dev/topics/auth/default/#permissions-and-authorization
new_user.user_permissions.add(permission1, permission2, etc...)
あなたの目的のためには、すべての新しいユーザーを特定のグループに割り当て、そのグループにユーザーが必要とするすべてのアクセス許可を与える方が、おそらくはるかに簡単で効率的です。グループのメンバーは、これらの権限も継承します。
グループを作成し、管理者でアクセス許可を割り当てることができます。次に、登録コードに次のようなものを追加するだけです。
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)
dgelの答えは、私にとって実用的な解決策につながる方向を示してくれました。本質的に、彼が示唆しているように見えるものは次のとおりです。
- アクセス許可を設定するモデルのContentTypeを取得します。このコンテキストでは、コンテンツ タイプはDjango モデルに関する情報を保持するオブジェクトです。
- を使用して、管理内で許可するコンテンツ タイプとアクションで構成されるPermissionオブジェクトを作成します
Permission.objects.get()
。ここで唯一難しいのはcodename
、管理者権限の場合、アクション (「追加」、「変更」、または「削除」)、アンダースコア、およびモデル名で構成されるパラメーターを理解することです。したがって、 というモデルがあり、そのモデルFoo
に対するすべてのパーミッションを作成する場合は、Foo
モデルのコンテンツ タイプとコード名add_foo
、change_foo
、および をそれぞれ持つ 3 つのパーミッションが必要になりdelete_foo
ます。 - を使用してこれらの権限を割り当て
user.user_permissions.add(permission)
ます。
コード 例については、dgel の回答を参照してください。既存の Django データベースの認証アプリ ( manage.py dumpdata auth
) のデータ ダンプを見ると、アクセス許可の内部動作についても洞察が得られました。
Google でこの質問を見つけたので、あなたの質問に正確にお答えします。私が Django 1.9 でグループを使って何をしているかを示してから、それをユーザーに行う方法を示します。
from django.contrib.auth.models import Group, Permission group, __ = Group.objects.get_or_create(name='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()
将来アクセス許可を追加する可能性があり、すべてのユーザーをやり直す代わりにグループに追加できるため、グループを好みます。
Django 1.6 以降:
すべてのユーザーには、アクセス許可に対する多対多のフィールドuser_permissions
があります。これにアクセス許可を追加できます。
your_user.user_permissions.add(permission)
v1.6 ドキュメント:
- Django.contrib.auth API (User、Group、および Permission オブジェクトを表示)
- デフォルトのアクセス許可を認証する(クリア、追加、削除する方法を示します)