def persistent_params(*param_names): def decorate(view_func): @wraps(view_func) def decorated(request, *args, **kwargs): response = view_func(request, *args, **kwargs) if response.status_code in (301, 302, 303, 307): location = response['Location'] parts = location.split('?') if len(parts) == 1: query_dict = QueryDict('', mutable=True) else: query_dict = QueryDict(parts[1], mutable=True) for name in param_names: query_dict[name] = request.GET.get(name, None) new_query_string = query_dict.urlencode() response['Location'] = parts[0] + '?' + new_query_string return response return decorated return decorate