2015-09-07 8 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' 

मैं इस https://groups.google.com/forum/#!topic/django-developers/8MdaWtJp4VQ लेख मिल जाए, वे कहते हैं कि मैं management.py नाम की एक फ़ाइल के अंदर अपने post_migrate हैंडलर परिभाषित करना चाहिए (न models.py फ़ाइल में कोड सहित), लेकिन काम नहीं करता

अंत में, मेरा प्रश्न है: मुझे यह कोड मेरे कस्टम post_migrate सिग्नल के लिए कहां रखा जाना चाहिए?

अग्रिम धन्यवाद।

+0

आप Django को 'MyAppConfig' का उपयोग करने के लिए कैसे कह रहे हैं? आपकी 'INSTALLED_APPS' सेटिंग में? – Alasdair

+0

वास्तव में केवल 'INSTALLED_APPS' tuple में ऐप नाम जोड़कर, पर्याप्त होना चाहिए या क्या मुझे एक और कॉन्फ़िगरेशन जोड़ना चाहिए? – slackmart

उत्तर

6

Django docs आपके ऐप कॉन्फ़िगरेशन की तैयार विधि में post_migrate सिग्नल को जोड़ने की अनुशंसा करते हैं। डॉक्स अपडेट होने से पहले, Google समूह आपको लिंक करने के लिए पुराना है।

आप भी अपनी INSTALLED_APPS सेटिंग में specify the app config की जरूरत है।

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

अपने अनुप्रयोग कॉन्फ़िगर करने के लिए एक और तरीका है अपने अनुप्रयोग के __init__.py में default_app_config उपयोग करने के लिए है। Configuring Applications देखें। लेकिन दूसरी तरफ (AppConfig के लिए बिंदीदार पथ) को प्राथमिकता दी जाती है।

+0

कूल सामान, बहुत बहुत धन्यवाद। – slackmart

संबंधित मुद्दे