# In urls.py urlpatterns = ('myproject.myapp.views', url('^(?P[a-z0-9]+)/view/$', 'my_view'), url('^(?P[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