2010-02-19 11 views
14

मेरे पास एक बड़े ग्राहक आधार के साथ एक django साइट है। मैं अपने ग्राहक सेवा विभाग को सामान्य उपयोगकर्ता खातों को बदलने, पासवर्ड बदलने, ईमेल पते इत्यादि जैसी चीजों को करने की क्षमता देना चाहता हूं। हालांकि, अगर मैं किसी को अंतर्निहित auth | user | Can change user अनुमति देता हूं, तो उन्हें is_superuser ध्वज सेट करने की क्षमता प्राप्त होती है अपने खाते सहित किसी भी खाते पर। (!!!)"उपयोगकर्ता परिवर्तन" अनुमति देते समय मैं Django व्यवस्थापक में अनुमति वृद्धि को कैसे रोकूं?

गैर-सुपरसियर कर्मचारियों के लिए इस विकल्प को हटाने का सबसे अच्छा तरीका क्या है? मुझे यकीन है कि इसमें django.contrib.auth.forms.UserChangeForm उपclassing शामिल है और इसे मेरे पहले से ही कस्टम UserAdmin ऑब्जेक्ट में जोड़ रहा है ... किसी भी तरह। लेकिन मुझे यह कैसे करना है इस पर कोई दस्तावेज नहीं मिल रहा है, और मैं अभी तक आंतरिकों को पर्याप्त रूप से समझ नहीं पा रहा हूं।

उत्तर

19

वे किसी भी खाते पर is_superuser ध्वज सेट करने की क्षमता प्राप्त करते हैं, जिसमें स्वयं भी शामिल है। (!!!)

इतना ही नहीं, वे भी खुद को किसी भी अनुमतियाँ एक-एक करके, एक ही प्रभाव देने के लिए क्षमता हासिल ...

मुझे यकीन है कि यह Django उपवर्गीकरण शामिल .contrib.auth.forms.UserChangeForm

ठीक है, जरूरी नहीं। Django के व्यवस्थापक के परिवर्तन पृष्ठ में जो फॉर्म आप देखते हैं वह गतिशील रूप से व्यवस्थापक अनुप्रयोग द्वारा बनाया गया है, और UserChangeForm पर आधारित है, लेकिन यह कक्षा username फ़ील्ड में रेगेक्स सत्यापन को मुश्किल से जोड़ती है।

और मेरे पहले से ही कस्टम UserAdmin वस्तु में यह hooking ...

एक कस्टम UserAdmin यहां जाने का रास्ता है। मूल रूप से, आप ऐसा ही कुछ करने के लिए fieldsets संपत्ति बदलना चाहते हैं:

class MyUserAdmin(UserAdmin): 
    fieldsets = (
     (None, {'fields': ('username', 'password')}), 
     (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), 
     # Removing the permission part 
     # (_('Permissions'), {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}), 
     (_('Important dates'), {'fields': ('last_login', 'date_joined')}), 
     # Keeping the group parts? Ok, but they shouldn't be able to define 
     # their own groups, up to you... 
     (_('Groups'), {'fields': ('groups',)}), 
    ) 

लेकिन समस्या यह है कि यहाँ इस प्रतिबंध को सभी उपयोगकर्ताओं के लिए लागू होगी। यदि यह वही नहीं है जो आप चाहते हैं, तो उदाहरण के लिए आप उपयोगकर्ताओं की अनुमति के आधार पर अलग-अलग व्यवहार करने के लिए change_view ओवरराइड कर सकते हैं। कोड स्निपेट:

class MyUserAdmin(UserAdmin): 
    staff_fieldsets = (
     (None, {'fields': ('username', 'password')}), 
     (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), 
     # No permissions 
     (_('Important dates'), {'fields': ('last_login', 'date_joined')}), 
     (_('Groups'), {'fields': ('groups',)}), 
    ) 

    def change_view(self, request, *args, **kwargs): 
     # for non-superuser 
     if not request.user.is_superuser: 
      try: 
       self.fieldsets = self.staff_fieldsets 
       response = super(MyUserAdmin, self).change_view(request, *args, **kwargs) 
      finally: 
       # Reset fieldsets to its original value 
       self.fieldsets = UserAdmin.fieldsets 
      return response 
     else: 
      return super(MyUserAdmin, self).change_view(request, *args, **kwargs) 
+0

कि चाल किया । इस तरह के एक पूर्ण जवाब के लिए धन्यवाद! –

+0

चूंकि मैं अनुमतियों का प्रबंधन करने के लिए समूह का उपयोग कर रहा हूं, इसलिए मैंने समूह अनुभाग को 'staff_fieldsets' से हटा दिया है। –

+0

धन्यवाद! इसने मेरी बहुत मदद की! हालांकि, Django 1.1.2 व्यक्तिगत जानकारी और बाकी से पहले '_' जैसा प्रतीत नहीं होता था। – Tyug

0

Django 1.1 के लिए पूर्ण कोड (कर्मचारियों के लिए मूलभूत उपयोगकर्ता जानकारी तक ही सीमित नहीं है (superusers))

from django.contrib.auth.models import User 
from django.utils.translation import ugettext_lazy as _ 


class MyUserAdmin(UserAdmin): 
    my_fieldsets = (
     (None, {'fields': ('username', 'password')}), 
     (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), 
    ) 

    def change_view(self, request, object_id, extra_context=None): 
     # for non-superuser 
     print 'test' 
     if not request.user.is_superuser: 
      self.fieldsets = self.my_fieldsets 
      response = UserAdmin.change_view(self, request, object_id, 
extra_context=None) 
      return response 
     else: 
      return UserAdmin.change_view(self, request, object_id, 
extra_context=None) 


admin.site.unregister(User) 
admin.site.register(User, MyUserAdmin) 
0

मेहरबान को महान धन्यवाद। मेरी साइट के लिए ऐसा करने के साथ मैं क्या आया था कि मुझे अतिरिक्त रूप से सभी क्षेत्रों को स्वयं के अलावा अन्य उपयोगकर्ताओं के लिए पढ़ने की आवश्यकता है। तो मेहरबान के जवाब के आधार पर मैं केवल पढ़ने के लिए फ़ील्ड और पासवर्ड फ़ील्ड छुपा addeed जब स्वयं नहीं देखने

class MyUserAdmin(UserAdmin): 
    model = User 
    staff_self_fieldsets = (
     (None, {'fields': ('username', 'password')}), 
     (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), 
     # No permissions 
     (_('Important dates'), {'fields': ('last_login', 'date_joined')}), 
    ) 

    staff_other_fieldsets = (
     (None, {'fields': ('username',)}), 
     (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), 
     # No permissions 
     (_('Important dates'), {'fields': ('last_login', 'date_joined')}), 
    ) 

    staff_self_readonly_fields = ('last_login', 'date_joined') 

    def change_view(self, request, object_id, form_url='', extra_context=None, *args, **kwargs): 
     # for non-superuser 
     if not request.user.is_superuser: 
      try: 
       if int(object_id) != request.user.id: 
        self.readonly_fields = User._meta.get_all_field_names() 
        self.fieldsets = self.staff_other_fieldsets 
       else: 
        self.readonly_fields = self.staff_self_readonly_fields 
        self.fieldsets = self.staff_self_fieldsets 

       response = super(MyUserAdmin, self).change_view(request, object_id, form_url, extra_context, *args, **kwargs) 
      except: 
       logger.error('Admin change view error. Returned all readonly fields') 

       self.fieldsets = self.staff_other_fieldsets 
       self.readonly_fields = ('first_name', 'last_name', 'email', 'username', 'password', 'last_login', 'date_joined') 
       response = super(MyUserAdmin, self).change_view(request, object_id, form_url, extra_context, *args, **kwargs) 
      finally: 
       # Reset fieldsets to its original value 
       self.fieldsets = UserAdmin.fieldsets 
       self.readonly_fields = UserAdmin.readonly_fields 
      return response 
     else: 
      return super(MyUserAdmin, self).change_view(request, object_id, form_url, extra_context, *args, **kwargs) 
2

स्वीकार किए जाते हैं जवाब के नीचे भाग एक रेस स्थिति दो कर्मचारियों उपयोगकर्ताओं एक ही समय में व्यवस्थापक प्रपत्र तक पहुँचने का प्रयास करता है, तो जहां है उनमें से एक को सुपरसुर फॉर्म मिल सकता है।

try: 
    self.readonly_fields = self.staff_self_readonly_fields 
    response = super(MyUserAdmin, self).change_view(request, object_id, form_url, extra_context, *args, **kwargs) 
finally: 
    # Reset fieldsets to its original value 
    self.fieldsets = UserAdmin.fieldsets 

इस रेस स्थिति से बचने के लिए (और मेरी राय में समाधान के समग्र गुणवत्ता में सुधार), हम get_fieldsets() और get_readonly_fields() तरीकों सीधे ओवरराइड कर सकते हैं:

class UserAdmin(BaseUserAdmin): 
    staff_fieldsets = (
     (None, {'fields': ('username')}), 
     ('Personal info', {'fields': ('first_name', 'last_name', 'email')}), 
     # No permissions 
     ('Important dates', {'fields': ('last_login', 'date_joined')}), 
    ) 
    staff_readonly_fields = ('username', 'first_name', 'last_name', 'email', 'last_login', 'date_joined') 

    def get_fieldsets(self, request, obj=None): 
     if not request.user.is_superuser: 
      return self.staff_fieldsets 
     else: 
      return super(UserAdmin, self).get_fieldsets(request, obj) 

    def get_readonly_fields(self, request, obj=None): 
     if not request.user.is_superuser: 
      return self.staff_readonly_fields 
     else: 
      return super(UserAdmin, self).get_readonly_fields(request, obj) 
संबंधित मुद्दे