コード例 #1
0
ファイル: utils.py プロジェクト: kpavlovsky/django-subdomains
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)
コード例 #2
0
ファイル: utils.py プロジェクト: Schnouki/django-subdomains
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