urls template tag bootstrap django

template - django views



¿Cómo puedo obtener la URL completa/absoluta(con dominio) en Django? (17)

¿Cómo puedo obtener la URL completa / absoluta (por ejemplo, https://example.com/some/path ) en Django sin el módulo de Sitios ? Eso es una tontería ... ¡No debería necesitar consultar mi base de datos para enganchar la URL!

Quiero usarlo con reverse() .


django-fullurl

Si intentas hacer esto en una plantilla de Django, he lanzado un pequeño paquete de PyPI django-fullurl para permitirte reemplazar las etiquetas de url y plantillas static con fullurl y fullstatic , como esto:

{% load fullurl %} Absolute URL is: {% fullurl "foo:bar" %} Another absolute URL is: {% fullstatic "kitten.jpg" %}

Esperamos que estas insignias se mantengan actualizadas automáticamente:

En una vista, por supuesto, puede usar request.build_absolute_uri lugar.


En su opinión, simplemente haga esto:

base_url = "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)


Entiendo:

wsgiref.util.request_uri(request.META)

Obtenga el uri completo con el esquema, el host, la ruta del puerto y la consulta.


Examine el diccionario Request.META que aparece. Creo que tiene el nombre del servidor y el puerto del servidor.


Otra forma más. Podría usar build_absolute_uri() en su view.py y pasarlo a la plantilla.

ver.py

def index(request): baseurl = request.build_absolute_uri() return render_to_response(''your-template.html'', { ''baseurl'': baseurl })

tu-plantilla.html

{{ baseurl }}


Para crear un enlace completo a otra página desde una plantilla, puede usar esto:

{{ request.META.HTTP_HOST }}{% url ''views.my_view'' my_arg %}

request.META.HTTP_HOST proporciona el nombre de host y url proporciona el nombre relativo. El motor de plantillas luego los concatena en una url completa.


Prueba el siguiente código:

{{ request.scheme }}://{{ request.META.HTTP_HOST }}


Puedes probar "request.get_full_path ()"


Sé que esta es una vieja pregunta. Pero creo que la gente todavía se topa con esto mucho.

Hay un par de bibliotecas que complementan la funcionalidad predeterminada de Django. He intentado algunos Me gusta la siguiente biblioteca cuando se hace referencia inversa a las URL absolutas:

https://github.com/fusionbox/django-absoluteuri

Otro que me gusta porque puedes armar fácilmente un dominio, protocolo y ruta es:

https://github.com/RRMoelker/django-full-url

Esta biblioteca le permite simplemente escribir lo que quiere en su plantilla, por ejemplo:

{{url_parts.domain}}


Si está usando el framework REST de django, puede usar la función de reversa de rest_framework.reverse . Esto tiene el mismo comportamiento que django.core.urlresolvers.reverse , excepto que usa un parámetro de solicitud para construir una URL completa.

from rest_framework.reverse import reverse # returns the full url url = reverse(''view_name'', args=(obj.pk,), request=request) # returns only the relative url url = reverse(''view_name'', args=(obj.pk,))

Editado para mencionar la disponibilidad solo en el marco REST


Si no desea acceder a la base de datos, puede hacerlo con una configuración. Luego, use un procesador de contexto para agregarlo a cada plantilla:

# settings.py (Django < 1.9) ... BASE_URL = ''http://example.com'' TEMPLATE_CONTEXT_PROCESSORS = ( ... ''myapp.context_processors.extra_context'', ) # settings.py (Django >= 1.9) TEMPLATES = [ { ''BACKEND'': ''django.template.backends.django.DjangoTemplates'', ''DIRS'': [], ''APP_DIRS'': True, ''OPTIONS'': { ''context_processors'': [ ''django.template.context_processors.debug'', ''django.template.context_processors.request'', ''django.contrib.auth.context_processors.auth'', ''django.contrib.messages.context_processors.messages'', # Additional ''myapp.context_processors.extra_context'', ], }, }, ] # myapp/context_processors.py from django.conf import settings def extra_context(request): return {''base_url'': settings.BASE_URL} # my_template.html <p>Base url is {{ base_url }}.</p>


Si no puede obtener acceso a la request , no puede usar get_current_site(request) como se recomienda en algunas soluciones aquí. Puede usar una combinación del marco de Sitios nativos y get_absolute_url en get_absolute_url lugar. Configure al menos un Site en el administrador, asegúrese de que su modelo tenga un método get_absolute_url() , 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 = ''http://{domain}{path}''.format(domain=domain, path=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


Si quieres usarlo con reverse() puedes hacer esto: request.build_absolute_uri(reverse(''view_name'', args=(obj.pk, )))


También puede usar get_current_site como parte de la aplicación del sitio ( from django.contrib.sites.models import get_current_site ). Toma un objeto de solicitud y toma como valor predeterminado el objeto de sitio que ha configurado con SITE_ID en settings.py si la solicitud es None . Lea más en la documentación para usar el framework 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 / ordenado como request.build_absolute_url() , pero se puede usar cuando los objetos de solicitud no están disponibles, y tiene una URL de sitio predeterminada.


También puedes usar:

import socket socket.gethostname()

Esto está funcionando bien para mí,

No estoy completamente seguro de cómo funciona. Creo que este es un nivel un poco más bajo y devolverá el nombre de host de su servidor, que podría ser diferente al nombre de host utilizado por su usuario para acceder a su página.


Utilice el método práctico request.build_absolute_uri() a petición, pásele la URL relativa y le dará una completa.

De forma predeterminada, se devuelve la URL absoluta para request.get_full_path() , pero puede pasar una URL relativa como el primer argumento para convertirla en una URL absoluta.


request.get_host() te dará el dominio.