Funciones utilitarias django.urls

reverse()

La traducción de los textos es la siguiente:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None, *, query=None, fragment=None)[fuente]

viewname puede ser el nombre de un patrón URL <naming-url-patterns>` o el objeto de vista callable utilizado en la URLconf. Por ejemplo, dado el siguiente url:

from news import views

path("archive/", views.archive, name="news-archive")

puedes utilizar cualquiera de las siguientes para revertir el URL:

# using the named URL
reverse("news-archive")

# passing a callable object
# (This is discouraged because you can't reverse namespaced views this way.)
from news import views

reverse(views.archive)

Si el URL acepta argumentos, puedes pasarlos en args. Por ejemplo:

from django.urls import reverse


def myview(request):
    return HttpResponseRedirect(reverse("arch-summary", args=[1945]))

También puedes pasar kwargs en lugar de args. Por ejemplo:

>>> reverse("admin:app_list", kwargs={"app_label": "auth"})
'/admin/auth/'

args y kwargs no se pueden pasar a reverse() al mismo tiempo.

Si no se puede hacer una coincidencia, reverse() lanza una excepción NoReverseMatch.

La función reverse() puede revertir una gran variedad de patrones regulares para URLs, pero no todos los posibles. La principal restricción en este momento es que el patrón no puede contener elecciones alternativas utilizando el carácter vertical bar ("|"). Puedes utilizar dichos patrones con gusto para coincidir contra URL entrantes y enviarlas a vistas, pero no puedes revertir tales patrones.

El argumento current_app permite proporcionar una pista al resolutor indicando la aplicación a la que pertenece la vista actualmente ejecutada. Este argumento current_app se utiliza como pista para resolver nombres de espacio de aplicaciones en URLs en instancias de aplicación específicas, según la estrategia de resolución de URL <topics-http-reversing-url-namespaces>`.

El argumento urlconf es el módulo de URLconf que contiene los patrones URL para usar al revertir. Por defecto, se utiliza el root URLconf del hilo actual.

La query argumento de palabra clave especifica parámetros que se deben agregar a la URL devuelta. Puede aceptar una instancia de QueryDict (como request.GET) o cualquier valor compatible con urllib.parse.urlencode(). La cadena de consulta codificada se agrega a la URL resuelta, precedida por un ?.

La argumento de palabra clave fragment especifica un identificador de fragmento que se debe agregar a la URL devuelta (es decir, después de la ruta y la cadena de consulta, precedido por un #).

Ejemplo:

>>> from django.urls import reverse
>>> reverse("admin:index", query={"q": "biscuits", "page": 2}, fragment="results")
'/admin/?q=biscuits&page=2#results'
>>> reverse("admin:index", query=[("color", "blue"), ("color", 1), ("none", None)])
'/admin/?color=blue&color=1&none=None'
>>> reverse("admin:index", query={"has empty spaces": "also has empty spaces!"})
'/admin/?has+empty+spaces=also+has+empty+spaces%21'
>>> reverse("admin:index", fragment="no encoding is done")
'/admin/#no encoding is done'

Los argumentos query y fragment fueron agregados.

Nota

La cadena devuelta por reverse() ya está urlquoted. Por ejemplo:

>>> reverse("cities", args=["Orléans"])
'.../Orl%C3%A9ans/'

Aplicar codificación adicional (como urllib.parse.quote()) al resultado de reverse() puede producir resultados indeseables.

Reversando vistas basadas en clase por objeto de vista

El objeto de vista también puede ser el resultado de llamar a as_view() si se utiliza el mismo objeto de vista en la URLConf. Siguiendo el ejemplo original, el objeto de vista podría definirse como:

news/views.py
 from django.views import View


 class ArchiveView(View): ...


 archive = ArchiveView.as_view()

Sin embargo, recuerda que las vistas nomencladas no pueden ser revertidas por objeto de vista.

reverse_lazy()

Una versión evaluada de forma relajada de reverse().

reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None, *, query=None, fragment=None)

Es útil cuando necesitas usar una reversión de URL antes de que se cargue la configuración de URLs de tu proyecto. Algunos casos comunes en los que es necesario esta función son:

  • proporcionar una URL revertida como el atributo url de una vista basada en clase genérica.

  • proporcionar una URL revertida a un decorador (como el argumento login_url para el decorador django.contrib.auth.decorators.permission_required()).

  • proporcionar una URL revertida como valor por defecto para un parámetro en la firma de una función.

Los argumentos query y fragment fueron agregados.

resolve()

La función resolve() se puede utilizar para resolver rutas de URL a las funciones de vista correspondientes. Tiene la siguiente firma:

resolve(path, urlconf=None)[fuente]

path es la ruta de URL que deseas resolver. Al igual que con reverse(), no necesitas preocuparte por el parámetro urlconf. La función devuelve un objeto ResolverMatch que te permite acceder a diversos metadatos sobre la URL resuelta.

Si la URL no se resuelve, la función lanza una excepción Resolver404 (una subclase de Http404) .

class ResolverMatch[fuente]
func

La función de vista que se utilizaría para servir la URL

args

Los argumentos que se pasarían a la función de vista, tal como se han parseado desde la URL.

kwargs

Todos los argumentos clave que se pasarían a la función de vista, es decir captured_kwargs y extra_kwargs.

captured_kwargs

Los argumentos clave capturados que se pasarían a la función de vista, tal como se han parseado desde la URL.

extra_kwargs

Los argumentos clave adicionales que se pasarían a la función de vista.

url_name

El nombre del patrón de URL que coincide con la URL.

route

La ruta del patrón de URL coincidente.

Por ejemplo, si path('users/<id>/', ...) es el patrón coincidente, route contendrá 'users/<id>/'.

tried

La lista de patrones de URL intentados antes de que la URL coincida con uno o agote los patrones disponibles.

app_name

El espacio de nombres de aplicación para el patrón de URL que coincide con la URL.

app_names

La lista de componentes de espacio de nombres individuales en el espacio de nombres de aplicación completo para el patrón de URL que coincide con la URL. Por ejemplo, si el app_name es 'foo:bar', entonces app_names será ['foo', 'bar'].

namespace

El espacio de nombres de la instancia para el patrón de URL que coincide con la URL.

namespaces

La lista de componentes del espacio de nombres individual en el espacio de nombres completo de la instancia para el patrón de URL que coincide con la URL. Por ejemplo, si el espacio de nombres es foo:bar, entonces los espacios de nombres serán ['foo', 'bar'].

view_name

El nombre del vista que coincide con la URL, incluyendo el espacio de nombres si lo hay.

Un objeto ResolverMatch se puede interrogar para proporcionar información sobre el patrón de URL que coincide con una URL:

# Resolve a URL
match = resolve("/some/path/")
# Print the URL pattern that matches the URL
print(match.url_name)

Un objeto ResolverMatch también se puede asignar a un triple:

func, args, kwargs = resolve("/some/path/")

Una posible utilización de la función resolve() sería probar si una vista lanzaría un error Http404 antes de redirigir a ella:

from urllib.parse import urlsplit
from django.urls import resolve
from django.http import Http404, HttpResponseRedirect


def myview(request):
    next = request.META.get("HTTP_REFERER", None) or "/"
    response = HttpResponseRedirect(next)

    # modify the request and response as required, e.g. change locale
    # and set corresponding locale cookie

    view, args, kwargs = resolve(urlsplit(next).path)
    kwargs["request"] = request
    try:
        view(*args, **kwargs)
    except Http404:
        return HttpResponseRedirect("/")
    return response

get_script_prefix()

get_script_prefix()[fuente]

Normalmente, siempre debes utilizar la función reverse() para definir URLs dentro de tu aplicación. Sin embargo, si tu aplicación construye parte de la jerarquía de URL por sí misma, es posible que ocasionalmente necesites generar URLs. En ese caso, necesitarás poder encontrar la URL base del proyecto Django dentro de su servidor web (normalmente, reverse() se encarga de esto por ti). En ese caso, puedes llamar a get_script_prefix(), lo que devolverá la parte prefix de script de la URL para tu proyecto Django. Si tu proyecto Django está en la raíz de su servidor web, siempre es "/".

Advertencia

Esta función no puede ser utilizada fuera del ciclo de solicitud-respuesta ya que depende de valores inicializados durante ese ciclo.