2009-06-16 36 views
9

मैं सोच रहा हूं कि मैं django मॉडल के साथ एक सरल 'ऑब्जेक्ट स्वामित्व' प्रणाली कैसे पूरा कर सकता हूं, जैसे डिफ़ॉल्ट रूप से, केवल किसी ऑब्जेक्ट का स्वामी इसे संपादित कर सकता है।Django में ऑब्जेक्ट स्वामित्व

class Meta: 
    permissions  = (
     ("manage_object", "Can manage objects"), 
    ) 

'स्वामित्व' स्थापित करने के लिए मैं कर दिया है:

मैं एक 'प्रबंधन' समूह इस बिंदु पर वस्तु धारकों की ओर से सभी वस्तुओं संपादित करें, और रखने की अनुमति के लिए प्रयास कर रहा हूँ एक कस्टम अनुमति जोड़ा मॉडल में डीफ़ जोड़ने के विचार से खिलवाड़:

def owner(self): 
    return self.user 

लेकिन फिर, मैं आगे कैसे जा सकता हूं? मैं यानी एक दृश्य में अनुमतियाँ लागू कर सकता है और एक टेम्पलेट के साथ प्रासंगिक यूआई प्रदर्शित करते हैं, .:

if request.user is object.owner: 
    # ... do stuff 
elseif request.user.has_perm.can_manage: # this line is probably not right 
    # ... do something else 

... और फिर एक टेम्पलेट स्तर पर अलग UI तत्व प्रस्तुत करते हैं।

तो, सवाल यह है:

  • क्या दोष/लाभ इस दृष्टिकोण के साथ देखते हैं?
  • क्या सिफारिशें हैं?
  • या, किसी भी अन्य पहले लागू तरीकों?

सर्वश्रेष्ठ धन्यवाद!

उत्तर

16

मेरे दृष्टिकोण मॉडल के लिए एक विधि को जोड़ने की जाएगी:

class YourModelWithOwnership(models.model): 
    ... 

    def user_can_manage_me(self, user): 
     return user == self.user or user.has_perm('your_app.manage_object') 

मैं तो उस विधि जब भी कोई अनुमति की जांच की आवश्यकता है फोन चाहते हैं, और कुछ परिणाम के आधार पर कार्रवाई करें। तो एक दृश्य के लिए है कि हो सकता है

from django.shortcuts import get_object_or_404 
... 

def view_func(request, item_id): 
    item = get_object_or_404(YourModelWithOwnership, id=item_id) # or whatever is needed to get the object 
    if not item.user_can_manage_me(request.user): 
     # user not allowed to manage 
     ... 
    else: 
     ... 

बाद में मैं शायद एहसास होता है कि वह अब भी हर राय यह है कि है कि परीक्षण की जरूरत में लिखने के लिए काफी कुछ बॉयलरप्लेट कोड है, तो मैं एक अपवाद लागू होता है जब कोई उपयोगकर्ता कर सकते हैं फेंक दिया है 'टी एक वस्तु का प्रबंधन ...

class CannotManage(Exception): 
    pass 

... और मॉडल के लिए एक और पद्धति जोड़ें:

from django.db import models 
from django.shortcuts import get_object_or_404 

class YourModelWithOwnership(models.model): 
    ... 

    @classmethod 
    def get_manageable_object_or_404(cls, user, *args, **kwds): 
     item = get_object_or_404(cls, *args, **kwds) 
     if not item.user_can_manage_me(user): 
      raise CannotManage 
     return item 

फिर, दृश्य कार्यों में, यह किया जा सकता है:

def view_func(request, item_id): 
    item = YourModelWithOwnership.get_manageable_object_or_404(request.user, id=item_id) 
    ... 

यह निश्चित रूप से अपवाद उठाएगा जब उपयोगकर्ता स्वामी नहीं है और उसके पास उचित अनुमति नहीं है। उस अपवाद को process_exception()custom middleware वर्ग की विधि में संभाला जा सकता है ताकि सभी उदाहरणों के लिए एक ही हैंडलर हो जहां उपयोगकर्ता को ऑब्जेक्ट के साथ गड़बड़ करने की अनुमति नहीं है।

+0

या, लेकिन क्या होगा यदि आप केवल एक दृश्य सजावट चाहते हैं जो दृश्यों को अपडेट/हटाने के लिए उपयोग को अवरुद्ध करता है? – CpILL

0

आप RowLevelPermissions शाखा में देख सकते हैं। इसे 1.1 बीटा में भी शामिल नहीं किया गया है, मुझे लगता है कि इसे अभी भी कुछ विकास की जरूरत है।

+1

वह शाखा पूरी तरह से पूरी तरह से 100% मृत है। यह मुख्य लाइन Django में कभी भी पुनर्जीवित, पूरा, अद्यतन, या एकीकृत नहीं किया जाएगा। दुर्भाग्यवश, एसवीएन के पास यह कहने का कोई तरीका नहीं है कि "यह शाखा बंद है और उसके पास कोई और काम नहीं होगा", इसलिए लोग इसे आगे बढ़ते रहते हैं। –

+0

ओह। खैर, वे वैसे भी दस्तावेज़ों में कुछ उल्लेख कर सकते हैं। – Pyetras

1

कुछ समय पहले मैंने the usual technique for doing this in the admin लिखा था। कार्यान्वयन कैसे काम करता है यह देखने के लिए आप इसके माध्यम से पढ़ना चाह सकते हैं।

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