एक आवेदन के लिए मैं निर्माण कर रहा हूं, मैं एक साधारण सजावटी के माध्यम से पंक्ति स्तर की अनुमति प्रदान करना चाहता हूं। मैं ऐसा इसलिए कर सकता हूं क्योंकि स्थिति यह है कि 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
स्रोत
2012-12-02 17:48:53
यह ध्यान दिया जाना चाहिए कि [Django (# 11383)] (https://code.djangoproject.com/ticket/11383) में एक बग है जो "चयनित हटाएं" व्यवस्थापक कार्रवाई के दौरान ऑब्जेक्ट स्तर अनुमतियों की जांच को रोकता है दौड़ हैं। – jnns
क्या आप जानते हैं कि 'admin.TabularInline' के साथ एक ही चीज़ कैसे करें? – xleon