emp.has_perm('myappname.is_member')
あなたが与えた例では、私は確かにそうなることを期待しますFalse
。Employer
新しいオブジェクトに明示的にis_member
許可を与えない限り、そのオブジェクトには許可がありません。
プログラムでアクセス許可を与えるには、実際のアクセス許可オブジェクトを取得して、それをEmployer
'sに追加する必要がありuser_permissions
ます。
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(Employer)
permission = Permission.objects.get(content_type=content_type, codename='is_member')
emp = Employer.objects.create(blablabla)
emp.save()
emp.user_permissions.add(permission)
シェルでテストするには、ユーザーごとに作成されたアクセス許可キャッシュを削除する必要がある場合があります。そうhas_perm
しないと、実際のアクセス許可が反映されない場合があります。
delattr(emp, '_perm_cache')
あなたの質問に答える:
Employer
すべての人にis_member
許可を与えたい場合は、いくつかのオプションがあります。
save
のメソッドをオーバーライドして、Employer
存在しないかどうかを確認しますself.pk
(つまり、新しいオブジェクトであり、保存後に上記のようにアクセス許可を作成します。あまりきれいではありませんが、機能します。
独自の認証バックエンドを作成します。権限コードが'is_member'
でありUser
、Employer
インスタンスがある場合は、True
権限を使用しないでください。権限システムは、権限を動的に付与および取り消すことができるように設計されています。User
aが-であるかどうかだけを気にする場合は、Employer
それをテストします。権限を使用して複雑にしないでください。