2010-05-21 27 views
225

Me preguntaba cómo obtener la URL actual dentro de una plantilla.¿Cómo obtener la URL actual dentro de una plantilla de Django?

decir que mi URL era

/user/profile/ 

¿Cómo puedo devolver esto a la plantilla?

+2

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

+2

Todas las respuestas a continuación me hicieron pensar que necesitaba hacer algo de gimnasia para tener acceso a 'solicitud' en una plantilla. En Django 1.10 acabo de acceder a '{{request.path}}' en la plantilla y funciona. Por defecto 'django.core.context_processors.request' ya está configurado en settings.py si usó' startproject' – User

Respuesta

105

Django 1.9 y superiores:

## template 
{{ request.path }} 
{{ request.get_full_path }} 

antigua:

## settings.py 
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request', 
) 

## views.py 
from django.template import * 

def home(request): 
    return render_to_response('home.html', {}, context_instance=RequestContext(request)) 

## template 
{{ request.path }} 
+2

Un poco lacónico, y no es correcto. Es 'render_to_response', y no' render_to_request'. ¡Y no puede definir 'TEMPLATE_CONTEXT_PROCESSORS' como lo hace en settings.py, sin mencionar los otros procesadores predeterminados que pueden usarse en las plantillas! – RedGlyph

+8

A partir de 2016, ya no es necesario que agregue nada a views.py. Siempre que se cargue django.core.context_processors.request en TEMPLATE_CONTEXT_PROCESSORS, tiene acceso a {{request.path}} de la plantilla. – Routhinator

+5

'request.path' no incluye parámetros de consulta como'? Foo = bar'. Use 'request.get_full_path' en su lugar. – Flimm

264

Puede buscar la dirección URL en la plantilla de la siguiente manera:

<p>URL of this page: {{ request.get_full_path }}</p> 

o

{{ request.path }} Si y No necesitas los parámetros adicionales.

Algunas precisiones y correcciones se deben llevar a hypete's y Igancio's respuestas, voy a resumir aquí toda la idea, para referencia futura.

Si necesita la variable request en la plantilla, que debe añadir el 'django.core.context_processors.request' a la configuración TEMPLATE_CONTEXT_PROCESSORS, no es por defecto (Django 1.4).

También debe no olvidar los demás procesadores de contexto utilizados por sus aplicaciones. Por lo tanto, para agregar la petición a los otros procesadores por defecto, se podría añadir esto en su configuración, para evitar la codificación dura de la lista de procesadores predeterminado (que puede llegar a cambiar en versiones posteriores):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP 

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request', 
) 

Entonces, siempre send the request contents in your response que, por ejemplo, como esto:

from django.shortcuts import render_to_response 
from django.template import RequestContext 

def index(request): 
    return render_to_response(
     'user/profile.html', 
     { 'title': 'User profile' }, 
     context_instance=RequestContext(request) 
    ) 
+4

Utilicé una vista de clase genérica ampliada, y no fue necesario agregar 'solicitud' al contexto. – Bobort

+0

Definitivamente más limpio para evitar la codificación de la lista TCP, pero docs.djangoproject.com/en/dev/topics/settings/#default-settings dice: 'Tenga en cuenta que un archivo de configuración no debe importar de global_settings, porque eso es redundante' – Medorator

+3

'return render (request, 'user/profile.html', {'title': 'User profile'})' is short –

1

ésta es una cuestión de edad, sino que se puede resumir con la misma facilidad, ya que si está usando Django-registro.

En su enlace de Iniciar sesión y Cerrar sesión (digamos en el encabezado de su página) agregue el siguiente parámetro al enlace que irá a iniciar o cerrar sesión. Tu enlace debería verse así.

<li><a href="http://www.noobmovies.com/accounts/login/?next={{ request.path | urlencode }}">Log In</a></li> 

<li><a href="http://www.noobmovies.com/accounts/logout/?next={{ request.path | urlencode }}">Log Out</a></li> 

que es simplemente que, nada más que hay que hacer, al terminar la sesión que serán inmediatamente redirige a la página que están en, para acceder en, van a llenar el formulario y será entonces redirigir a la página que estaban en. Incluso si intentan iniciar sesión incorrectamente, todavía funciona.

+3

debe codificar la ruta si está en una url: '{{request.path | urlencode}}' – Quentin

5

En plantillas de Django
Simplemente obtener la URL actual de {{request.path}}
Para conseguir URL completa con los parámetros {{request.get_full_path}}

Nota: Debe añadir request en Django TEMPLATE_CONTEXT_PROCESSORS

4

supongo que enviar a la plantilla completa la solicitud es un poco redundante. Lo hago de esta manera

def home(request): 
    app_url = request.path 
    return render(request, 'home.html', {'app_url': app_url}) 

##template 
{{ app_url }} 
2

Las otras respuestas fueron incorrectas, al menos en mi caso. request.path no proporciona la URL completa, solo la URL relativa, p. /paper/53. No encontré ninguna solución adecuada, así que terminé codificando la parte constante de la URL en la Vista antes de concatenarla con request.path.

+0

Mire la fecha. Las respuestas fueron dadas hace 6 o 7 años. – dotty

0

Las respuestas anteriores son correctas y dan una respuesta excelente y breve.

También estaba buscando para obtener el URL de la página actual en la plantilla de Django ya que mi intención era activar HOME page, MEMBERS page, CONTACT page, ALL POSTS page cuando se solicitan.

Estoy pegando la parte del fragmento de código HTML que puede ver a continuación para comprender el uso de request.path. Se puede ver en mi live website en http://pmtboyshostelraipur.pythonanywhere.com/

<div id="navbar" class="navbar-collapse collapse"> 
    <ul class="nav navbar-nav"> 
     <!--HOME--> 
     {% if "/" == request.path %} 
     <li class="active text-center"> 
      <a href="/" data-toggle="tooltip" title="Home" data-placement="bottom"> 
      <i class="fa fa-home" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"> 
      </i> 
      </a> 
     </li> 
     {% else %} 
     <li class="text-center"> 
      <a href="/" data-toggle="tooltip" title="Home" data-placement="bottom"> 
      <i class="fa fa-home" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"> 
      </i> 
      </a> 
     </li> 
     {% endif %} 

     <!--MEMBERS--> 
     {% if "/members/" == request.path %} 
     <li class="active text-center"> 
     <a href="/members/" data-toggle="tooltip" title="Members" data-placement="bottom"> 
      <i class="fa fa-users" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
     </a> 
     </li> 
     {% else %} 
     <li class="text-center"> 
     <a href="/members/" data-toggle="tooltip" title="Members" data-placement="bottom"> 
      <i class="fa fa-users" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
     </a> 
     </li> 
     {% endif %} 

     <!--CONTACT--> 
     {% if "/contact/" == request.path %} 
     <li class="active text-center"> 
     <a class="nav-link" href="/contact/" data-toggle="tooltip" title="Contact" data-placement="bottom"> 
      <i class="fa fa-volume-control-phone" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
      </a> 
     </li> 
     {% else %} 
     <li class="text-center"> 
     <a class="nav-link" href="/contact/" data-toggle="tooltip" title="Contact" data-placement="bottom"> 
      <i class="fa fa-volume-control-phone" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
      </a> 
     </li> 
     {% endif %} 

     <!--ALL POSTS--> 
     {% if "/posts/" == request.path %} 
     <li class="text-center"> 
     <a class="nav-link" href="/posts/" data-toggle="tooltip" title="All posts" data-placement="bottom"> 
      <i class="fa fa-folder-open" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
      </a> 
     </li> 
     {% else %} 
     <li class="text-center"> 
     <a class="nav-link" href="/posts/" data-toggle="tooltip" title="All posts" data-placement="bottom"> 
      <i class="fa fa-folder-open" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
      </a> 
     </li> 
     {% endif %} 
</ul> 

Cuestiones relacionadas