¿Cómo obtener la URL actual dentro de una plantilla de Django?


Me preguntaba cómo obtener la URL actual dentro de una plantilla.

Digamos que mi URL era

/user/profile/

¿Cómo devuelvo esto a la plantilla?

Author: Mel, 2010-05-21

7 answers

Django 1.9 y superior:

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

Antiguo:

## 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 }}
 133
Author: httpete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-06 11:17:24

Puede obtener la URL en su plantilla de esta manera:

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

O por

{{ request.path }} si no necesita los parámetros adicionales.

Algunas precisiones y correcciones deben ser llevadas a hypete's y Igancio respuestas, voy a resumir la idea completa aquí, para referencia futura.

Si necesita la variable request en la plantilla, debe agregar el 'django.núcleo.context_processors.solicitud' al TEMPLATE_CONTEXT_PROCESSORS configuración, no es por por defecto (Django 1.4).

También debe no olvidar los otros procesadores de contexto utilizados por sus aplicaciones. Por lo tanto, para agregar la solicitud a los otros procesadores predeterminados, puede agregar esto en su configuración, para evitar codificar la lista de procesadores predeterminados (que muy bien puede 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, a condición de que envíe el request contenido en su respuesta, por ejemplo:

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)
    )
 267
Author: RedGlyph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:41

En la plantilla de django
Simplemente obtenga la url actual de {{request.path}}
Para obtener url completa con parámetros {{request.get_full_path}}

Nota: Debe agregar request en django TEMPLATE_CONTEXT_PROCESSORS

 5
Author: Savad KP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-15 07:25:47

Supongo que enviar a la plantilla solicitud completa 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 }}
 4
Author: Radren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-18 07:36:57

Las otras respuestas eran incorrectas, al menos en mi caso. request.path no proporciona la url completa, solo la url relativa, por ejemplo /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.

 2
Author: Deleet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 01:33:09

Esta es una pregunta antigua, pero se puede resumir tan fácilmente como esta si está utilizando django-registration.

En su enlace de Inicio de sesión y Cierre de sesión (digamos en el encabezado de su página) agregue el siguiente parámetro al enlace que irá a iniciar sesión 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>

Eso es simplemente, no hay nada más que hacer, al cerrar la sesión serán redirigidos inmediatamente a la página en la que se encuentran, para iniciar sesión, completarán el formulario y luego se redirigirá a la página en la que estaban. Incluso si intentan iniciar sesión incorrectamente, todavía funciona.

 1
Author: Chris Hawkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-31 13:45:10

Las respuestas anteriores son correctas y dan una respuesta grande y corta.

También estaba buscando obtener la 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 les solicite.

Estoy pegando la parte del fragmento de código HTML que puedes ver a continuación para entender el uso de request.path. Puedes verlo 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>

 0
Author: hygull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-31 01:04:09