2010-10-30 8 views
6

मेरे पास सरल सवाल है। डीबी में इसे मैन्युअल रूप से बनाए बिना Django में उपयोगकर्ता भूमिका कैसे बनाएं?Django में कस्टम अनुमति (उपयोगकर्ता भूमिका) कैसे बनाएं?

संपादित करें: मुझे विशिष्ट अनुमति बनाने की आवश्यकता है। इसलिए केवल इस अनुमति वाले उपयोगकर्ता मॉडल के विशिष्ट क्षेत्र को बदल सकते हैं। मुझे कुछ उपयोगकर्ताओं के लिए केवल एक फ़ील्ड 'readonly' बनाने की आवश्यकता है। क्या यह django में संभव है?

+0

क्या आपका मतलब '/ admin/auth/group/add /' है? –

+0

धन्यवाद लेकिन मुझे विशिष्ट अनुमति बनाने की आवश्यकता है। इसलिए केवल इस अनुमति वाले उपयोगकर्ता मॉडल के विशिष्ट क्षेत्र को बदल सकते हैं। मुझे बस कुछ उपयोगकर्ताओं के लिए 'फ़ील्डोनली' बनाने की ज़रूरत है .. –

+2

आप 'can_change_xy' जैसी कस्टम अनुमति को परिभाषित कर सकते हैं और स्पष्ट रूप से उस दृश्य को' user.has_perm() 'के साथ अपने दृश्य फ़ंक्शन में देख सकते हैं। जहां तक ​​मुझे पता है, व्यक्तिगत क्षेत्र अनुमतियों के लिए कोई सामान्य समाधान नहीं है। Http://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions और http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models देखें .User.has_perm। –

उत्तर

0

आप django-authority देख सकते हैं। यह आपको ऑब्जेक्ट स्तर अनुमतियों और यहां तक ​​कि तार्किक जांच को लागू करने देता है। लॉजिकल चेक डेटाबेस में संग्रहीत नहीं होते हैं, लेकिन वे फ़ंक्शन हैं जिन्हें मान पास किया जा सकता है और True या False लौटा सकता है। बेशर्म प्लग: मेरे कांटा Django 1.2 वस्तु अनुमति बैकएंड लागू करता है, तो आप इसे पसंद इस्तेमाल कर सकते हैं: userA.hasperm("see_xyz")

7

का उपयोग कर डीबी मतलब है कि आप Django अनुमति प्रणाली का उपयोग नहीं करना चाहते हैं के बिना एक पर्म बना रहा है। उस बिंदु पर, मैं पूछूंगा कि आप इसका उपयोग क्यों नहीं करना चाहते हैं?

यदि यह Django अनुमति sywstem उपयोग करने के लिए ठीक है, आप एक अनुमति बना सकते हैं और विधि बचाने व्यवस्थापक overrriding ... की तरह से यह जांच कर सकते हैं: अपने models.py

class SomeModel(Model): 
    your_spec_field = FieldType(...) 
    class Meta: 
     permissions = (
      ("some_perm", u"A name for your default permission"), 
     ) 

में

अपने संबंधित admin.py में

class SomeModelAdmin(ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     if change: 
      curr_value = SomeModel.objects.get(pk=obj.id) 
      if not request.user.has_perm('<your_app>.some_perm'): 
       obj.your_spec_field = curr_value.your_spec_field 
     else: 
      if not request.user.has_perm('<your_app>.some_perm') 
       obj.your_spec_field = '' # or the default value according to your field type 
     obj.save() 

इस दृष्टिकोण में, आप इसे सहेजने से पहले संबंधित रिकॉर्ड की स्थिति प्राप्त करते हैं और संबंधित अनुमति की जांच करते हैं। यदि उपयोगकर्ता के पास आवश्यक अनुमति नहीं है। तो आप अपने क्षेत्र के मान को पिछले एक के साथ बदलते हैं। यदि यह एक नया रिकॉर्ड है, तो आप उस फ़ील्ड को अपने इच्छित मूल्य पर सेट कर सकते हैं।

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