# In urls.py
urlpatterns = ('myproject.myapp.views',
url('^(?P<url_key>[a-z0-9]+)/view/$', 'my_view'),
url('^(?P<url_key>[a-z0-9]+)/write/$', 'my_write'),
...
)
# In views.py
# Requires Python 2.5 or higher
from functools import wraps
from django.shortcuts import get_object_or_404
from django.core.exceptions import PermissionDenied
def object_context(view_func):
@wraps(view_func)
def decorated(request, url_key, *args, **kwargs):
# Put your own discovery conditions here.
instance = get_object_or_404(MyModel, url_key=url_key, is_active=True)
return view_func(request, instance, *args, **kwargs)
return decorated
# For those who use granular pemission systems.
def object_perm_required(*perm_names):
def decorate(view_func):
@wraps(view_func)
@object_context
def decorated(request, instance, *args, **kwargs):
for perm_name in perm_names:
# Put your permission check routine here.
if request.user.has_row_perm(instance, perm_name):
break
else:
raise PermissionDenied()
return view_func(request, instance, *args, **kwargs)
return decorated
return decorate
@object_context
def my_view(request, instance):
# do something
@object_permission_required('can_write')
def my_write(request, instance):
# do something
Comments
For that kind of approach, you can take a look at http://code.welldev.org/djangorators too. At least there are tests ;).
#
@david_bgk: That's great! Well, there should be some kind of global collective unconsciousness. :P
#