¿Cómo puedo obtener la URL completa/absoluta (con dominio) en Django?
¿Cómo puedo obtener la URL completa/absoluta (por ejemplo https://example.com/some/path
) en Django sin el módulo Sitios ? Eso es una tontería... ¡No debería necesitar consultar mi base de datos para obtener la URL!
Quiero usarlo con reverse()
.
Utilice el práctico método request.build_absolute_uri() cuando lo solicite, pásele la URL relativa y le dará una completa.
De forma predeterminada, se devuelve la URL absoluta request.get_full_path()
, pero puede pasarle una URL relativa como primer argumento para convertirla en una URL absoluta.
>>> request.build_absolute_uri()
'https://example.com/music/bands/the_beatles/?print=true'
>>> request.build_absolute_uri('/bands/?print=true')
'https://example.com/bands/?print=true'
Si quieres usarlo reverse()
puedes hacer esto:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
Si no puede acceder, request
no podrá utilizarlo get_current_site(request)
como se recomienda en algunas soluciones aquí. Puede utilizar una combinación del marco nativo de Sites y get_absolute_url
en su lugar. Configure al menos un sitio en el administrador, asegúrese de que su modelo tenga un método get_absolute_url() y luego:
>>> from django.contrib.sites.models import Site
>>> domain = Site.objects.get_current().domain
>>> obj = MyModel.objects.get(id=3)
>>> path = obj.get_absolute_url()
>>> url = f'https://{domain}{path}'
>>> print(url)
'http://example.com/mymodel/objects/3/'
https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
También puede utilizarlo get_current_site
como parte de la aplicación de sitios ( from django.contrib.sites.models import get_current_site
). Toma un objeto de solicitud y, de forma predeterminada, es el objeto de sitio que ha configurado SITE_ID
en settings.py si la solicitud es None
. Lea más en la documentación para usar el marco de sitios.
p.ej
from django.contrib.sites.shortcuts import get_current_site
request = None
full_url = ''.join(['http://', get_current_site(request).domain, obj.get_absolute_url()])
No es tan compacto ni tan ordenado como request.build_absolute_url()
, pero se puede utilizar cuando los objetos de solicitud no están disponibles y tiene una URL de sitio predeterminada.