Мне было интересно, как получить текущий URL-адрес в шаблоне.
Скажите, что мой URL был
/user/profile/
Как вернуть это в шаблон?
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 }}
render_to_response
, а не render_to_request
. И вы не можете определить TEMPLATE_CONTEXT_PROCESSORS
как вы это делаете в settings.py, без упоминания других процессоров по умолчанию, которые вполне могут использоваться в шаблонах!
Вы можете получить 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)
)
request
в контекст.
Note that a settings file should not import from global_settings, because that's redundant
В шаблоне django
Просто введите текущий URL из {{request.path}}
Для получения полного URL-адреса с параметрами {{request.get_full_path}}
Примечание:
Вы должны добавить request
в django TEMPLATE_CONTEXT_PROCESSORS
Я предполагаю, что отправить полный шаблон шаблона будет немного лишним. Я делаю это так.
def home(request):
app_url = request.path
return render(request, 'home.html', {'app_url': app_url})
##template
{{ app_url }}
Другие ответы были неверными, по крайней мере, в моем случае. request.path
не предоставляет полный URL-адрес, только относительный URL-адрес, например. /paper/53
. Я не нашел правильного решения, поэтому я закончил жестко кодировать постоянную часть URL-адреса в представлении, прежде чем конкатенировать его с помощью request.path
.
Это старый вопрос, но его можно суммировать так же легко, как это, если вы используете 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>
Это просто, ничего больше не нужно делать, при выходе из системы они будут немедленно перенаправлены на страницу, на которой они находятся, для входа в систему, они заполнит форму и затем перенаправят на страницу, на которой они были, Даже если они неправильно пытаются войти в систему, все еще работает.
{{ request.path|urlencode }}
request
в шаблоне. В Django 1.10 я просто получаю доступ к{{request.path}}
в шаблоне, и это работает. По умолчаниюdjango.core.context_processors.request
уже настроен в settings.py, если вы использовалиstartproject