2015-09-07 5 views
6

私はdjango django.contrib.auth.models.Permissionモデルに依存していますので、私のプロジェクトで何らかのリファクタリングを行っています。今まで私はpost_saveシグナルを使って新しいユーザごとにパーミッションを定義していましたので、ユーザが作成されたときにパーミッションをuser.user_permissions.add(the_permission)で割り当てます。これは完全に動作します。カスタムpost_migrateシグナルを定義しています

今、モデルを使用して、ユーザーに必要な権限を明確にしたいと考えています。

これは私のコードです:

from django.apps import AppConfig 
from django.db.models.signals import post_migrate 
from django.contrib.auth.models import Group, Permission 


def create_group(name, permissions): 
    group = Group.objects.create(name=name) 
    [group.permissions.add(permission) for permission in permissions] 


def define_company_groups(sender, **kwargs): 
    permissions = [ 
     Permission.objects.get(codename='add_mymodel'), 
     Permission.objects.get(codename='change_mymodel'), 
    ] 
    create_group('managers', permissions) 


class MyAppConfig(AppConfig): 
    name = 'players' 
    verbose_name = 'The players app' 

    def ready(self): 
     post_migrate.connect(define_company_groups, sender=self) 

は後に、このコードを定義し、私は、コール./manage.py migrate後、このハンドラが解雇されるべきであることを期待しています。しかし、それは起こりませんが、私が得たすべては、次のとおりです。

Running post-migrate handlers for application players 
Adding permission 'players | mymodel | Can add mymodel' 
Adding permission 'companies | company | Can change mymodel' 
Adding permission 'companies | company | Can delete company' 

私は、彼らは、私は(どちらもmodels.pyファイル内のコードを含む)management.pyという名前のファイル内の私のpost_migrateハンドラを定義する必要が言うこのhttps://groups.google.com/forum/#!topic/django-developers/8MdaWtJp4VQ記事を見つけることが、動作しません。

最後に、ここに私の質問があります:私のカスタムpost_migrateシグナルのコードはどこに置かなければいけませんか?

ありがとうございます。

+0

Djangoに 'MyAppConfig'を使用するように教えてください。あなたの 'INSTALLED_APPS'設定で? – Alasdair

+0

実際には、 'INSTALLED_APPS'タプルにアプリケーション名を追加するだけで十分ですか、別の設定を追加する必要がありますか? – slackmart

答えて

6

Django docsは、post_migrate信号をアプリの設定の準備ができている方法で接続することをおすすめします。リンク先のGoogleグループの投稿は、ドキュメントが更新される前から古くなっています。

INSTALLED_APPS設定では、specify the app configも必要です。

INSTALLED_APPS = [ 
    'myapp.apps.MyAppConfig', 
    # ... 
] 

にアプリを設定するもう一つの方法は、あなたのアプリの__init__.pydefault_app_configを使用することです。 Configuring Applicationsを参照してください。しかし、もう1つの方法(AppConfigの点線のパス)が優先されます。

+0

クールなもの、ありがとう。 – slackmart

関連する問題