2012-04-20 12 views
8

私のモデルにMetaクラスを追加し、DBを同期させてシェルにオブジェクトを作成しました これはfalseを返すので、何不足していることは、おそらくいくつかの他のファイル内の設定のいくつかの並べ替えが..あなたが与えた例ではDjangoのパーミッションをモデルに追加し、シェルを使ってテストする方法

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') 

答えて

18

があり、私はemp.has_perm('myappname.is_member')が実際Falseことを期待します。新しいEmployerオブジェクトに明示的に与えない限り、is_member権限は持っていません。

は、プログラムで使用すると、実際の権限オブジェクトを取得し、それを追加する必要があり、それに許可を与えるEmployerさん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) 

はシェルでそれをテストするにはご質問への対応

delattr(emp, '_perm_cache') 

:それはそうhas_permは実際の権限が反映されない場合があり、各USER-のために作成され

あなたはすべての単一Employeris_member権限を持っているしたい場合は、いくつかのオプションがあります。

  1. は、それが新しいオブジェクトであることを意味している(何もself.pkがないかどうかを確認するためにEmployersaveメソッドをオーバーライドします私は保存した後に上記のように許可を作成します。非常にきれいではありませんが、うまくいくでしょう。

  2. あなた自身でauthentication backendを書きます。許可コードが'is_member'で、UserEmployerインスタンスを持っている場合は、True

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

+0

OKモデルに作成されたすべてのオブジェクトにこのアクセス権があるという意味のモデルにアクセス許可を追加したい場合はどうすればいいですか?私は容赦しています。しかし、私は非常に混乱しています –

+0

それはアクセス許可の仕組みではありません。 'is_member'パーミッションを追加しても、すべての' Employee'がそのパーミッションを持つことになるわけではありません。つまり、「従業員」はその許可を持っています。 – dgel

+0

ありがとうございました:) –

関連する問題