#24276: django.contrib.auth.decorators.user_passes_test doesn't pass *args and *kwargs to resolve_url -------------------------+------------------------------------------------- Reporter: | Owner: nobody rubengrill | Type: Bug | Status: new Component: | Version: 1.7 contrib.auth | Keywords: login_url resolve_url Severity: Normal | login_required user_passes_test Triage Stage: | Has patch: 0 Unreviewed | Easy pickings: 1 | UI/UX: 0 -------------------------+------------------------------------------------- When using the decorator '''django.contrib.auth.decorators.user_passes_test''' or dependent decorators '''login_required''' and '''permission_required''', the given '''login_url''' can't be reversed when the url contains at least one parameter, because when '''reverse_url''' is called, the *args and *kwargs parameters are not passed.
{{{ urlpatterns = patterns('', url(r'^(?P<conference>[^/]+)/', include(patterns('', url(r'^$', conference_root, name='conference_root'), url(r'^admin/$', conference_admin, name='conference_admin'), ))) ) ... @login_required(login_url='conference:conference_root') def conference_admin(request, conference): return render(request, 'conference/admin.html', {'conference': conference}) }}} {{{ Reverse for 'conference_root' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: ['(?P<conference>[^/]+)/$'] }}} The *args and *kwargs parameters should be passed to resolve_url: {{{ def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME): """ Decorator for views that checks that the user passes the given test, redirecting to the log-in page if necessary. The test should be a callable that takes the user object and returns True if the user passes. """ def decorator(view_func): @wraps(view_func, assigned=available_attrs(view_func)) def _wrapped_view(request, *args, **kwargs): if test_func(request.user): return view_func(request, *args, **kwargs) path = request.build_absolute_uri() # # resolved_login_url = resolve_url(login_url or settings.LOGIN_URL) # resolved_login_url = resolve_url(login_url or settings.LOGIN_URL, *args, **kwargs) # If the login url is the same scheme and net location then just # use the path as the "next" url. login_scheme, login_netloc = urlparse(resolved_login_url)[:2] current_scheme, current_netloc = urlparse(path)[:2] if ((not login_scheme or login_scheme == current_scheme) and (not login_netloc or login_netloc == current_netloc)): path = request.get_full_path() from django.contrib.auth.views import redirect_to_login return redirect_to_login( path, resolved_login_url, redirect_field_name) return _wrapped_view return decorator }}} -- Ticket URL: <https://code.djangoproject.com/ticket/24276> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/053.67f1f3ca2b31957d91e66a63e5ffe182%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.