django

2012-08-09 12 views
14

में पंक्ति स्तर अनुमतियां django में पंक्ति स्तर अनुमतियाँ करने का कोई तरीका है? मैंने सोचा था कि वहाँ नहीं था लेकिन सिर्फ डॉक्स में इस पर ध्यान:django

अनुमतियां न केवल वस्तु के प्रकार के अनुसार, लेकिन यह भी प्रति विशिष्ट वस्तु दृष्टान्त सेट किया जा सकता। ModelAdmin वर्ग द्वारा has_add_permission(), has_change_permission() और has_delete_permission() और 0_प्रदान किए गए विधियों का उपयोग करके उसी प्रकार के विभिन्न ऑब्जेक्ट उदाहरणों को अनुमतियां अनुकूलित करना संभव है।

https://docs.djangoproject.com/en/dev/topics/auth/

लेकिन मैं कैसे वास्तव में उदाहरण अनुमतियाँ प्रति को लागू करने पर किसी भी प्रलेखन नहीं दिख रहा है

उत्तर

0

"अनुमति" उदाहरण आप सकता है के लिए Django available on PyPi
के लिए क्षुधा की एक बड़ी संख्या में हैं django-object-permission पर देखें।

दस्तावेज़ीकरण का क्या अर्थ है कि अनुमतियां लागू करने के लिए कार्यक्षमता है। और लोगों ने बस इसके लिए ऐप्स बनाकर ऐसा किया है।

5

पाइपलाइन वहाँ (इस एक ही पृष्ठ आप लिंक के नीचे से है):

हैंडलिंग वस्तु अनुमतियाँ

Django की अनुमति के ढांचे, वस्तु अनुमतियों के लिए एक नींव है, हालांकि कोई कोर में इसके लिए कार्यान्वयन। इसका मतलब है कि ऑब्जेक्ट अनुमतियों की जांच हमेशा झूठी या खाली सूची लौटाएगी (चेक प्रदर्शन के आधार पर)। एक प्रमाणीकरण बैकएंड प्रत्येक ऑब्जेक्ट से संबंधित प्राधिकरण विधि के लिए कीवर्ड पैरामीटर obj और user_obj प्राप्त करेगा और ऑब्जेक्ट स्तर अनुमति को उचित के रूप में वापस कर सकता है।

लेकिन कोई डिफ़ॉल्ट कार्यान्वयन प्रदान नहीं किया गया है। चूंकि यह एक आम विषय है; SO पर बहुत सारे answers हैं। दाईं ओर जांचें और आप कुछ सूचीबद्ध देखेंगे।

आधार विचार django packages' perm grid ब्राउज़ करना और ऑब्जेक्ट स्तर अनुमतियों का कार्यान्वयन करना है। मुझे व्यक्तिगत रूप से django-guardian पसंद है।

6

दस्तावेज़ों के बारे में बात करने के तरीके आपको व्यवस्थापक में विशेष वस्तुओं तक पहुंच प्रतिबंधित करने की अनुमति देंगे। प्रत्येक विधि ऑब्जेक्ट को प्ले में पास कर देती है, जिसे आप True या False पर लौटकर, उपयोगकर्ता इसे एक्सेस कर सकते हैं या नहीं, इसके बारे में निर्धारण करने के लिए उपयोग कर सकते हैं।

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    def has_add_permission(self, request): 
     # This one doesn't get an object to play with, because there is no 
     # object yet, but you can still do things like: 
     return request.user.is_superuser 
     # This will allow only superusers to add new objects of this type 

    def has_change_permission(self, request, obj=None): 
     # Here you have the object, but this is only really useful if it has 
     # ownership info on it, such as a `user` FK 
     if obj is not None: 
      return request.user.is_superuser or \ 
        obj.user == request.user 
      # Now only the "owner" or a superuser will be able to edit this object 
     else: 
      # obj == None when you're on the changelist page, so returning `False` 
      # here will make the changelist page not even viewable, as a result, 
      # you'd want to do something like: 
      return request.user.is_superuser or \ 
        self.model._default_manager.filter(user=request.user).exists() 
      # Then, users must "own" *something* or be a superuser or they 
      # can't see the changelist 

    def has_delete_permission(self, request, obj=None): 
     # This pretty much works the same as `has_change_permission` only 
     # the obj == None condition here affects the ability to use the 
     # "delete selected" action on the changelist 
+0

यह ध्यान दिया जाना चाहिए कि [Django (# 11383)] (https://code.djangoproject.com/ticket/11383) में एक बग है जो "चयनित हटाएं" व्यवस्थापक कार्रवाई के दौरान ऑब्जेक्ट स्तर अनुमतियों की जांच को रोकता है दौड़ हैं। – jnns

+0

क्या आप जानते हैं कि 'admin.TabularInline' के साथ एक ही चीज़ कैसे करें? – xleon

24

एक आवेदन के लिए मैं निर्माण कर रहा हूं, मैं एक साधारण सजावटी के माध्यम से पंक्ति स्तर की अनुमति प्रदान करना चाहता हूं। मैं ऐसा इसलिए कर सकता हूं क्योंकि स्थिति यह है कि request.user मॉडल ऑब्जेक्ट का मालिक है या नहीं।

के बाद काम करने के लिए लगता है:

from functools import wraps 
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist 

def is_owner_permission_required(model, pk_name='pk'): 
    def decorator(view_func): 
     def wrap(request, *args, **kwargs): 
      pk = kwargs.get(pk_name, None) 
      if pk is None: 
       raise RuntimeError('decorator requires pk argument to be set (got {} instead)'.format(kwargs)) 
      is_owner_func = getattr(model, 'is_owner', None) 
      if is_owner_func is None: 
       raise RuntimeError('decorator requires model {} to provide is_owner function)'.format(model)) 
      o=model.objects.get(pk=pk) #raises ObjectDoesNotExist 
      if o.is_owner(request.user): 
       return view_func(request, *args, **kwargs) 
      else: 
       raise PermissionDenied 
     return wraps(view_func)(wrap) 
    return decorator 

दृश्य:

@login_required 
@is_owner_permission_required(Comment) 
def edit_comment(request, pk): 
    ... 

यूआरएल:

url(r'^comment/(?P<pk>\d+)/edit/$', 'edit_comment'), 

मॉडल:

class Comment(models.Model): 
    user = models.ForeignKey(User, ... 
    <...> 
    def is_owner(self, user): 
     return self.user == user 

कोई भी प्रतिक्रिया या टिप्पणी की सराहना की जाती है।

पॉल Bormans