2015-09-07 8 views
6

Ich mache eine Art Refactoring für mein Projekt, wo ich auf das Modell Django django.contrib.auth.models.Permission angewiesen bin. Bisher definiere ich die Berechtigungen für jeden neuen Benutzer mit einem post_save-Signal, also wenn der Benutzer erstellt wird, ich ihre Berechtigungen mit zuweisen, funktioniert das perfekt.Definieren eines benutzerdefinierten post_migrate Signals

Jetzt möchte ich das Modell verwenden, um die Berechtigungen zu klassifizieren, die ein Benutzer haben sollte.

Dies ist mein Code:

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) 

Nach diesem Code definieren, erwarte ich, dass nach Aufruf ./manage.py migrate diese Handler ausgelöst werden sollen. Aber es geschieht nicht, alles was ich habe ist:

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' 

Ich finde diese https://groups.google.com/forum/#!topic/django-developers/8MdaWtJp4VQ Artikel, sie sagen, ich soll meinen post_migrate Handler management.py innerhalb einer Datei definieren genannt (weder mit dem Code in der Datei models.py), aber funktioniert nicht.

Schließlich, hier ist meine Frage: Wo sollte ich diesen Code für meine benutzerdefinierte post_migrate Signal?

Vielen Dank im Voraus.

+0

Wie sagen Sie Django, 'MyAppConfig' zu verwenden? In deiner 'INSTALLED_APPS' Einstellung? – Alasdair

+0

Eigentlich nur durch Hinzufügen der App-Name zum 'INSTALLED_APPS' Tupel, sollte ausreichend sein oder sollte ich eine andere Konfiguration hinzufügen? – slackmart

Antwort

6

Die Django docs empfehlen, das Signal post_migrate in der App-Konfig-Methode zu verbinden. Der Google-Gruppenbeitrag, auf den Sie verlinken, ist veraltet, bevor die Dokumente aktualisiert wurden.

Sie müssen auch specify the app config in Ihrer INSTALLED_APPS Einstellung.

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

Eine weitere Möglichkeit, Ihre App zu konfigurieren ist default_app_config in __init__.py Ihre Anwendung zu verwenden. Siehe Configuring Applications. Aber der andere Weg (gepunkteter Pfad zu AppConfig) ist bevorzugt.

+0

Coole Sachen, vielen Dank. – slackmart

Verwandte Themen