Как получить текущий URL в шаблоне Django?

205

Мне было интересно, как получить текущий URL-адрес в шаблоне.

Скажите, что мой URL был

/user/profile/

Как вернуть это в шаблон?

  • 2
    возможный дубликат пути чтения в шаблонах
  • 2
    Все приведенные ниже ответы заставили меня подумать, что мне нужно заняться гимнастикой, чтобы получить доступ к request в шаблоне. В Django 1.10 я просто получаю доступ к {{request.path}} в шаблоне, и это работает. По умолчанию django.core.context_processors.request уже настроен в settings.py, если вы использовали startproject
Теги:
templates

6 ответов

91
Лучший ответ

Django 1.9 и выше:

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

Старый:

## 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
    Немного лаконично и не правильно. Это render_to_response , а не render_to_request . И вы не можете определить TEMPLATE_CONTEXT_PROCESSORS как вы это делаете в settings.py, без упоминания других процессоров по умолчанию, которые вполне могут использоваться в шаблонах!
  • 8
    С 2016 года вам больше не нужно ничего добавлять в views.py. Пока django.core.context_processors.request загружен в TEMPLATE_CONTEXT_PROCESSORS - у вас есть доступ к {{request.path}} из шаблона.
Показать ещё 2 комментария
270

Вы можете получить URL-адрес в своем шаблоне следующим образом:

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

или

{{ request.path }}, если вам не нужны дополнительные параметры.

Некоторые исправления и исправления должны быть приведены к ответам и Igancio, я просто подытожу вся идея здесь, для справок в будущем.

Если вам нужна переменная request в шаблоне, вы должны добавить 'django.core.context_processors.request' в TEMPLATE_CONTEXT_PROCESSORS, это не по умолчанию (Django 1.4).

Вы также должны не забывать другие процессоры контекста, используемые вашими приложениями. Таким образом, чтобы добавить запрос к другим процессорам по умолчанию, вы можете добавить это в свои настройки, чтобы избежать жесткого кодирования списка процессоров по умолчанию (которые могут очень хорошо измениться в более поздних версиях):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

Затем, если вы отправляете request содержимое в своем ответе, например:

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
    Я использовал расширенный общий вид классов, и не было необходимости добавлять request в контекст.
  • 0
    Определенно чище, чтобы избежать жесткого кодирования списка TCP, но docs.djangoproject.com/en/dev/topics/settings/#default-settings говорит: Note that a settings file should not import from global_settings, because that's redundant
Показать ещё 3 комментария
5

В шаблоне django
Просто введите текущий URL из {{request.path}}
Для получения полного URL-адреса с параметрами {{request.get_full_path}}

Примечание: Вы должны добавить request в django TEMPLATE_CONTEXT_PROCESSORS

4

Я предполагаю, что отправить полный шаблон шаблона будет немного лишним. Я делаю это так.

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

##template
{{ app_url }}
1

Другие ответы были неверными, по крайней мере, в моем случае. request.path не предоставляет полный URL-адрес, только относительный URL-адрес, например. /paper/53. Я не нашел правильного решения, поэтому я закончил жестко кодировать постоянную часть URL-адреса в представлении, прежде чем конкатенировать его с помощью request.path.

  • 0
    Посмотри на дату. Ответы были даны 6 или 7 лет назад.
1

Это старый вопрос, но его можно суммировать так же легко, как это, если вы используете django-registration.

В вашей ссылке "Вход и выход" (скажем, в заголовке вашей страницы) добавьте следующий параметр к ссылке, которая войдет в логин или выход из системы. Ваша ссылка должна выглядеть так.

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

Это просто, ничего больше не нужно делать, при выходе из системы они будут немедленно перенаправлены на страницу, на которой они находятся, для входа в систему, они заполнит форму и затем перенаправят на страницу, на которой они были, Даже если они неправильно пытаются войти в систему, все еще работает.

  • 3
    Вы должны закодировать путь, если он указан в URL: {{ request.path|urlencode }}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню