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
権限を使用しないでください。権限システムは、権限を動的に付与および取り消すことができるように設計されています。Useraが-であるかどうかだけを気にする場合は、Employerそれをテストします。権限を使用して複雑にしないでください。