2015-09-07 29 views
6

Robię jakiś rodzaj refaktoryzacji dla mojego projektu, w którym polegam na modelu django django.contrib.auth.models.Permission. Do tej pory definiuję uprawnienia dla każdego nowego użytkownika za pomocą sygnału post_save, więc kiedy użytkownik jest tworzony, przypisuję jego uprawnienia przy użyciu user.user_permissions.add(the_permission), działa to idealnie.definiowanie niestandardowego sygnału post_migrate

Teraz chcę użyć modelu , aby sklasyfikować uprawnienia, które powinien posiadać użytkownik.

To jest mój kod:

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) 

Po zdefiniować ten kod, ja oczekuję, że po wywołaniu ./manage.py migrate uchwyt ten powinien zostać zwolniony. Ale to się nie stanie, wszystko co mam to:

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' 

znajdę ten https://groups.google.com/forum/#!topic/django-developers/8MdaWtJp4VQ artykuł, mówią powinienem określić mój obsługi post_migrate wewnątrz pliku o nazwie management.py (ani tym kodu w pliku models.py), ale nie działa.

Wreszcie, oto moje pytanie: Gdzie powinienem umieścić ten kod dla mojego niestandardowego sygnału post_migrate?

Z góry dziękuję.

+0

W jaki sposób mówisz Django, aby używał 'MyAppConfig'? W ustawieniu 'INSTALLED_APPS'? – Alasdair

+0

Właściwie po prostu dodanie nazwy aplikacji do krotki "INSTALLED_APPS" powinno być wystarczające, czy powinienem dodać kolejną konfigurację? – slackmart

Odpowiedz

6

Zaleca się podłączenie sygnałuw konfiguracji gotowej aplikacji. Grupy dyskusyjne opublikowane przez Ciebie są nieaktualne, sprzed zaktualizowania dokumentów.

Musisz również specify the app config w swoim ustawieniu INSTALLED_APPS.

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

Innym sposobem, aby skonfigurować aplikację jest użycie default_app_config w __init__.py swojej aplikacji. Zobacz Configuring Applications. Ale druga metoda (kropkowana ścieżka do AppConfig) jest preferowana.

+0

Fajne rzeczy, dziękuję bardzo. – slackmart