2010-07-14 403 views
44

¿Hay alguna manera de obtener la URL de la página actual y todos sus parámetros en una plantilla de Django?Django: obtener la URL de la página actual, incluidos los parámetros, en una plantilla

Por ejemplo, un templatetag que imprimir una dirección URL completa como /foo/bar?param=1&baz=2

+0

posible duplicado de [ruta de lectura en las plantillas] (http://stackoverflow.com/questions/2127937/reading-path-in-templates) –

+0

otra posible duplicado es [Obtener la URL actual withing una plantilla de Django ] (http://stackoverflow.com/questions/2882490/get-the-current-url-within-a-django-template) –

Respuesta

58

Escriba un procesador de contexto personalizado. p.ej.

def get_current_path(request): 
    return { 
     'current_path': request.get_full_path() 
    } 

agregar una ruta a esa función en sus TEMPLATE_CONTEXT_PROCESSORS ajustes variables, y lo utilizan en su plantilla, así:

{{ current_path }} 

Si usted quiere tener la request objeto completa en cada solicitud, puede utilice el procesador de contexto incorporado django.core.context_processors.request y luego use {{ request.get_full_path }} en su plantilla.

Ver:

+2

No se olvide de usar urlencode ie '{{request.get_getl_path | urlencode}}' si necesita esto para la redirección – Medorator

6

En un context_processors.py archivo (o similar):

def myurl(request): 
    return { 'myurlx': request.get_full_path() } 

En settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    wherever_it_is.context_processors.myurl, 
    ... 

En su template.html:

myurl={{myurlx}} 
+0

Lo siento, downvoted por error ... por favor haz un cambio para poder deshacer eso. –

1

Django tiene un montón de cosas incorporado, pero si no lo hace explícito lo que es lo que desea utilizar, que ganó' t ser utilizado.

Entonces, en el esquema MTV (Modelo, Plantilla, Vista) la vista recibe una solicitud y utiliza una plantilla para generar una respuesta, pasando un diccionario o todas las variables locales (usando la función locals()) de este ver. Sabiendo esto, podemos insertar la URL actual que venía de la respuesta, de esta manera:

views.py:

from django.shortcuts import render 

def page(request): 
    currentUrl = request.get_full_path() 
    return render(request, 'app/page.html', locals()) 

A continuación, en la plantilla 'app/pagina.html' sólo hay que hacer lo siguiente para mostrar la variable CURRENTURL que acabamos de crear y se pasa por medio de los locales():

app/plantilla/pagina.html:

{{ currentUrl }} 
1

En addtition a la respuesta de sdolan:

si está utilizando I18N y desea pasar el valor next a /i18n/setlang/ para cambiar el idioma de la página actual, entonces tendrá que quitar el código de idioma actual de la ruta completa. Algo así como:

full_path = request.get_full_path() 
current_path = full_path[full_path.index('/', 1):] 

Esto supone que cada camino tiene formato /LANG_CODE/any/other/stuff/with/?param='yay' y simplemente inicia LANG_CODE lo que sea (por ejemplo, /en/ resultará en /).

20

Usa la compilación de Django en el procesador de contexto para obtener la solicitud en el contexto de la plantilla. En la configuración de añadir request procesador para TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (

    # Put your context processors here 

    'django.core.context_processors.request', 
) 

y en uso de plantilla:

{{ request.get_full_path }} 

De esta manera usted no tiene que escribir ningún código nuevo por sí mismo.

+1

Cabe señalar que el uso de este método sobrescribe el TEMPLATE_CONTEXT_PROCESSORS predeterminado, por lo que tendrá que volver a agregarlos a la lista . [Los documentos] (https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS) tienen una lista de los valores predeterminados para incluir en la lista. – carruthd

0

Puede ver si su URL se diferencia de las demás.

{% if 'foo/bar/' in request.get_full_path %} 
Cuestiones relacionadas