# decorators.py
try:
from functools import wraps
except ImportError:
from django.utils.functional import wraps # Python 2.3, 2.4 fallback.
def remember_path(view_func):
"""
Decorator that stores the `request.path` URL in a session variable
to be used later, e.g. in a "Continue Shopping" link on a cart page.
"""
def _wrapped_view_func(request, *args, **kwargs):
request.session['last_path'] = request.path
return view_func(request, *args, **kwargs)
return wraps(view_func)(_wrapped_view_func)
# views.py example to remember path
@remember_path
def shopping_view(request):
# regular view code
# views.py example to use path
def cart_view(request):
# view code
return render_to_response('template.html', {
'last_path': request.session.get('last_path', '/'),
# other context
})
Comments
why it needs to be a decorator?
why not simple:
#
I wrote something almost identical to this for one of my projects, but backed it out after only a week or so in use. It tends to really wreak havoc with any kind of multiple-tabs workflow someone might be using on your site. Embrace statelessness :-)
#
@carljm: Someone did bring the multiple tabs problem to my attention, and it's a good caveat to put on this.
#