मुझे लगता है कि आपको जो पहला सवाल पूछना है वह यह है कि आपको किन अनुमतियों की आवश्यकता है और किस प्रकार की आवश्यकता है। किस तरह से, मेरा मतलब है कि आप मॉडल या वस्तु-स्तर चाहते हैं। अंतर स्पष्ट करने के लिए आपके पास एक मॉडल कार है। यदि आप सभी कारों पर अनुमति देना चाहते हैं, तो मॉडल-स्तर उपयुक्त है, लेकिन यदि आप प्रति-कार के आधार पर अनुमति देना चाहते हैं, तो आप ऑब्जेक्ट-स्तर चाहते हैं। आपको दोनों की आवश्यकता हो सकती है, और यह कोई समस्या नहीं है जैसा कि हम देखेंगे।
मॉडल की अनुमतियों के लिए, Django आपके लिए इन्हें संभालता है ... ज्यादातर। प्रत्येक मॉडल के लिए Django फॉर्म में 'appname.permissionname_modelname' की अनुमति देगा। यदि आपके पास कार मॉडल के साथ 'ड्राइवर' नामक एक ऐप है, तो एक अनुमति 'ड्राइवर.डेली_कार' होगी। Django द्वारा स्वचालित रूप से बनाई गई अनुमतियाँ बनाई जाएंगी, बदल जाएंगी, और हट जाएंगी। कुछ अजीब कारणों से उन्होंने सीआरयूडी से पढ़ने की अनुमति शामिल नहीं करने का फैसला किया, आपको यह खुद करना होगा। ध्यान दें कि Django ने किसी कारण से CRUD के 'अपडेट' को 'परिवर्तन' में बदलने का फैसला किया। किसी मॉडल में और अनुमतियाँ जोड़ने के लिए, अनुमतियाँ पढ़ें, आप मेटा क्लास का उपयोग करते हैं:
class Car( models.Model ):
class Meta:
permissions = (
( "read_car", "Can read Car" ),
)
ध्यान दें कि अनुमतियाँ tuples का एक समूह है, जहाँ tuple आइटम ऊपर वर्णित अनुमति और उस अनुमति का विवरण है। आपको permname_modelname कन्वेंशन का पालन करने की आवश्यकता नहीं है, लेकिन मैं आमतौर पर इसके साथ रहता हूं।
अंत में, अनुमतियों की जांच करने के लिए, आप has_perm का उपयोग कर सकते हैं:
obj.has_perm( 'drivers.read_car' )
जहां obj या तो उपयोगकर्ता या समूह का उदाहरण है। मुझे लगता है कि इसके लिए एक फ़ंक्शन लिखना आसान है:
def has_model_permissions( entity, model, perms, app ):
for p in perms:
if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
return False
return True
जहां इकाई (समूह या उपयोगकर्ता) पर अनुमतियों की जांच करने के लिए ऑब्जेक्ट है, मॉडल एक मॉडल का उदाहरण है, परमिट की जांच करने के लिए स्ट्रिंग की अनुमति के रूप में एक सूची है (जैसे ['पढ़ा', 'परिवर्तन')), और ऐप है एक स्ट्रिंग के रूप में आवेदन नाम। ऊपर के रूप में has_perm की जाँच करने के लिए आप कुछ इस तरह से कॉल करेंगे:
result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )
यदि आपको ऑब्जेक्ट या पंक्ति अनुमतियों का उपयोग करने की आवश्यकता है (उनका मतलब एक ही बात है), तो Django वास्तव में आपकी स्वयं की मदद नहीं कर सकता है। अच्छी बात यह है कि आप मॉडल और ऑब्जेक्ट परमिशन दोनों को एक साथ इस्तेमाल कर सकते हैं। यदि आप ऑब्जेक्ट अनुमतियाँ चाहते हैं, तो आपको या तो अपना स्वयं का लिखना होगा (यदि 1.2+ का उपयोग करके) या किसी अन्य व्यक्ति द्वारा लिखे गए प्रोजेक्ट को ढूंढना है, तो मुझे जो पसंद है वह है django-objectpermissions from washtontimes ।