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


309

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

Digamos que mi URL actual es:

.../user/profile/

¿Cómo devuelvo esto a la plantilla?


3
posible duplicado de ruta
Mark Mikofski

2
Todas las respuestas a continuación me hicieron pensar que necesitaba hacer algo de gimnasia para acceder a requestuna plantilla. En Django 1.10 solo accedo {{request.path}}a la plantilla y funciona. Por defecto django.core.context_processors.requestya está configurado en settings.py si lo usóstartproject
Usuario

Respuestas:


232

Django 1.9 y superior:

## template
{{ request.path }}  #  -without GET parameters 
{{ request.get_full_path }}  # - with GET parameters

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 }}

2
Un poco lacónico, y no correcto. Es render_to_responsey no render_to_request. ¡Y no puede definir TEMPLATE_CONTEXT_PROCESSORScomo lo hace en settings.py, sin mencionar los otros procesadores predeterminados que bien pueden usarse en las plantillas!
RedGlyph

8
A partir de 2016, ya no necesita agregar nada a views.py. Mientras django.core.context_processors.request se cargue en TEMPLATE_CONTEXT_PROCESSORS, usted tiene acceso a {{request.path}} desde la plantilla.
Routhinator

8
request.pathno incluye parámetros de consulta como ?foo=bar. Usar en su request.get_full_pathlugar.
Flimm

@Routhinator está de acuerdo contigo. pero es bueno saber que esos middleware necesitan ser incluidos para que esto suceda.
Marshall X

281

Puede buscar 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 llevarse a las respuestas de Hypete e Igancio. Solo resumiré toda la idea aquí, para referencia futura.

Si necesita la requestvariable en la plantilla, debe agregar 'django.core.context_processors.request' a la TEMPLATE_CONTEXT_PROCESSORSconfiguración, no es por defecto (Django 1.4).

Tampoco debe 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 predeterminada (que 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',
)

Luego, siempre que envíe los requestcontenidos en su respuesta , por ejemplo, así:

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)
    )

44
Usé una vista de clase genérica extendida, y no era necesario agregarla requestal contexto.
Bobort

Definitivamente más limpio para evitar codificar la lista TCP, pero docs.djangoproject.com/en/dev/topics/settings/#default-settings dice:Note that a settings file should not import from global_settings, because that’s redundant
usuario

3
return render(request, 'user/profile.html', {'title': 'User profile'})es más corto
Richard de Wit

2
recuerde incluir urlencode, es decir, {{request.get_full_path|urlenode}}si está redirigiendo
usuario

¿Cómo obtener parámetros de get_full_path ??
numerah


6

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

Nota : debe agregar requestdjangoTEMPLATE_CONTEXT_PROCESSORS


5

Supongo que la solicitud completa de envío a plantilla es un poco redundante. Lo hago asi

from django.shortcuts import render

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

##template
{{ app_url }}

4

Las otras respuestas fueron incorrectas, al menos en mi caso. request.pathno 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 request.path.


Mira la fecha. Las respuestas se dieron hace 6 o 7 años.
dotty

3

Ambos {{ request.path }} and {{ request.get_full_path }}devuelven la URL actual pero no la URL absoluta, por ejemplo:

your_website.com/wallpapers/new_wallpaper

Ambos volverán /new_wallpaper/ (observe las barras inclinadas iniciales y finales)

Entonces tendrás que hacer algo como

{% if request.path == '/new_wallpaper/' %}
    <button>show this button only if url is new_wallpaper</button>
{% endif %}

Sin embargo, puede obtener la URL absoluta usando (gracias a la respuesta anterior)

{{ request.build_absolute_uri }}

NOTA: no es necesario incluir requesten el settings.py, que ya está ahí.


1

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

En su enlace Iniciar sesión y Cerrar sesión (digamos en el encabezado de su página) agregue el siguiente parámetro al enlace que irá al inicio o cierre de sesión. Su 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 se necesita hacer nada más, al cerrar sesión se los redirigirá 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 se encontraban. Incluso si intentan iniciar sesión incorrectamente, todavía funciona.


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

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 pagecuando 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. Puede verlo en mi live websiteen 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>


2
Una pequeña sugerencia: si todo lo que está haciendo es verificar si agregar la activeclase a cada lielemento, ¿por qué no simplemente hacer eso en línea dentro de un lielemento: en <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>lugar de un bloque gigante if / else para el conjunto li? Eso ahorraría un montón de código redundante :)
tatlar

0

En Django 3, desea utilizar la etiqueta de plantilla de URL :

{% url 'name-of-your-user-profile-url' possible_context_variable_parameter %}

Para ver un ejemplo, vea la documentación

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.