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
