2011-10-11 19 views
16

डिफ़ॉल्ट रूप से django में जब syncdb django.contrib.auth के साथ चलाया जाता है, तो यह प्रत्येक मॉडल पर डिफ़ॉल्ट अनुमतियां बनाता है ... foo.can_change, foo.can_delete और foo.can_add। मॉडलों के लिए कस्टम अनुमतियां जोड़ने के लिए क्लास मेटा जोड़ सकते हैं: मॉडल के तहत और अनुमतियों को परिभाषित करें, जैसा कि यहां बताया गया है https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissionsdjango में उपयोगकर्ता मॉडल को कस्टम अनुमति कैसे जोड़ें?

मेरा सवाल यह है कि यदि मैं उपयोगकर्ता मॉडल को कस्टम अनुमति जोड़ना चाहता हूं तो मुझे क्या करना चाहिए? foo.can_view की तरह। मैं निम्नलिखित स्निपेट के साथ ऐसा कर सकता है,

ct = ContentType.objects.get(app_label='auth', model='user') 
perm = Permission.objects.create(codename='can_view', name='Can View Users', 
            content_type=ct) 
perm.save() 

लेकिन मैं कुछ है कि अच्छी तरह से syncdb साथ, उदाहरण के लिए वर्ग मेटा मेरी कस्टम मॉडल के नीचे खेलता है चाहता हूँ। क्या मुझे इन क्लास मेटा में होना चाहिए: UserProfile के तहत, क्योंकि यह उपयोगकर्ता मॉडल का विस्तार करने का तरीका है। लेकिन क्या यह करने का सही तरीका है? क्या यह उपयोगकर्ता प्रोफाइल मॉडल से जुड़ा नहीं होगा?

+0

आप ऐसा कर सकते हैं मॉडल प्रवास में: http://stackoverflow.com/a/32706020/538284 –

उत्तर

3

मुझे नहीं लगता कि वहाँ एक "सही" यहाँ का जवाब है, लेकिन सिवाय मैं Permission.objects.get_or_create को Permission.objects.create बदल गया है और कि syncdb

+0

, get_or_create नहीं होगा एक और अनुमति बनाते हैं नाम में परिवर्तन लेकिन कोडनेम ही रहता है? –

+1

आपको कोडनाम को केवल प्राप्त करने या बनाने के हिस्से के रूप में उपयोग करना चाहिए, और नाम को "डिफ़ॉल्ट" में डाल देना चाहिए – leech

8

आप की तरह कुछ कर सकता है के साथ सिंक करने लगता है काम मैं आप के रूप में ठीक उसी कोड का इस्तेमाल किया है इस:

अपने Django अनुप्रयोग जोड़ने के __init__.py में

:

from django.db.models.signals import post_syncdb 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth import models as auth_models 
from django.contrib.auth.models import Permission 

# custom user related permissions 
def add_user_permissions(sender, **kwargs): 
    ct = ContentType.objects.get(app_label='auth', model='user') 
    perm, created = Permission.objects.get_or_create(codename='can_view', name='Can View Users', content_type=ct) 
post_syncdb.connect(add_user_permissions, sender=auth_models) 
+0

'__init __। Py' में डालना और' post_syncdb' से कनेक्ट करना शायद एक अच्छा विचार है, लेकिन ऊपर दिया गया कोड मेरे लिए काम नहीं करता मुझे 'ContentType.objects.get_for_model (model = auth_models.User) 'का उपयोग करना होगा। अन्यथा, यह काम किया। – brianmearns

2

Django 1.8 के लिए एक अद्यतन जवाब। सिग्नल pre_migrate का उपयोग pre_syncdb के बजाय किया जाता है, क्योंकि सिंकडब को बहिष्कृत किया जाता है और दस्तावेज़ post_migrate के बजाय pre_migrate का उपयोग करने की अनुशंसा करते हैं यदि सिग्नल डेटाबेस को बदल देगा। इसके अलावा, @receiver सिग्नल में add_user_permissions कनेक्ट करने के लिए उपयोग किया जाता है।

from django.db.models.signals import pre_migrate 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth import models as auth_models 
from django.contrib.auth.models import Permission 
from django.conf import settings 
from django.dispatch import receiver 


# custom user related permissions 
@receiver(pre_migrate, sender=auth_models) 
def add_user_permissions(sender, **kwargs): 
    content_type = ContentType.objects.get_for_model(settings.AUTH_USER_MODEL) 
    Permission.objects.get_or_create(codename='view_user', name='View user', content_type=content_type) 
+3

क्या मैं पूछ सकता हूं कि मुझे यह कोड किस फाइल को रखना है? हालांकि यह Django के पुराने संस्करण के रूप में मॉडल में सेट किया गया था, लेकिन मुझे यकीन नहीं है ... – softwareplay

+0

@mcastle मैंने इसे '__init __। Py' में रखा है, लेकिन "DoNotExist: ContentType मिलान क्वेरी मौजूद नहीं है।" त्रुटि अभी भी आ रही है –

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