def reverse(viewname, subdomain=None, scheme=None, args=None, kwargs=None, current_app=None): """ Reverses a URL from the given parameters, in a similar fashion to :meth:`django.core.urlresolvers.reverse`. :param viewname: the name of URL :param subdomain: the subdomain to use for URL reversing :param scheme: the scheme to use when generating the full URL :param args: positional arguments used for URL reversing :param kwargs: named arguments used for URL reversing :param current_app: hint for the currently executing application """ urlconf = settings.SUBDOMAIN_URLCONFS.get(subdomain, settings.ROOT_URLCONF) domain = get_domain() if subdomain is not None: domain = '%s.%s' % (subdomain, domain) path = simple_reverse(viewname, urlconf=urlconf, args=args, kwargs=kwargs, current_app=current_app) return urljoin(domain, path, scheme=scheme)
def _real_reverse(viewname, subdomain=None, scheme=None, args=None, kwargs=None, current_app=None, path_only=False, _allow_fallback=True): """Actually reverse a URL from the given parameters.""" urlconf = settings.SUBDOMAIN_URLCONFS.get(subdomain, settings.ROOT_URLCONF) domain = get_domain() if subdomain is not None and not (getattr( settings, "SUBDOMAINS_AVOID_IF_ROOT_URLCONF", False) and urlconf == settings.ROOT_URLCONF): domain = '%s.%s' % (subdomain, domain) try: path = simple_reverse(viewname, urlconf=urlconf, args=args, kwargs=kwargs, current_app=current_app) if path_only: return path return urljoin(domain, path, scheme=scheme) except NoReverseMatch as exc: # If nothing was found and SUBDOMAINS_AUTO_NAMESPACE_FALLBACK is set, # try to find a subdomain that matches the view namespace, and use that # to run the search again. if _allow_fallback \ and getattr(settings, "SUBDOMAINS_AUTO_NAMESPACE_FALLBACK", False) \ and isinstance(viewname, str) and ':' in viewname: ns = viewname.split(':')[0] found, fallback_subdomain = find_subdomain_by_namespace(ns) if found: return _real_reverse(viewname, subdomain=fallback_subdomain, scheme=scheme, args=args, kwargs=kwargs, current_app=current_app, path_only=path_only, _allow_fallback=False) # Not found :/ raise exc