10

モデルにMetaクラスを追加し、DBを同期してから、シェルにオブジェクトを作成しました。オブジェクトはfalseを返すため、エラーがどこにあるのか、他のファイルに何らかの構成が含まれているのかがわかりません。

class Employer(User): # Employer inherits from User
    employer_verified = models.BooleanField(default=False)

    class Meta:
        permissions = (
            ("is_member", "Friendly permission description"),
        )

emp = Employer.objects.create(blablabla)
emp.save()
emp.has_perm('myappname.is_member')
4

1 に答える 1

20

emp.has_perm('myappname.is_member')あなたが与えた例では、私は確かにそうなることを期待しますFalseEmployer新しいオブジェクトに明示的に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許可を与えたい場合は、いくつかのオプションがあります。

  1. saveのメソッドをオーバーライドして、Employer存在しないかどうかを確認しますself.pk(つまり、新しいオブジェクトであり、保存後に上記のようにアクセス許可を作成します。あまりきれいではありませんが、機能します。

  2. 独自の認証バックエンドを作成します。権限コードが'is_member'でありUserEmployerインスタンスがある場合は、True

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

于 2012-04-20T19:47:31.570 に答える