it-swarm.com.ru

Django: получить URL текущей страницы, включая параметры, в шаблоне

Есть ли способ получить URL текущей страницы и все ее параметры в шаблоне Django?

Например, тег шаблона, который будет печатать полный URL-адрес, например /foo/bar?param=1&baz=2

53
Matt Hampel

Написать пользовательский контекстный процессор. например.

def get_current_path(request):
    return {
       'current_path': request.get_full_path()
     }

добавьте путь к этой функции в переменной настроек TEMPLATE_CONTEXT_PROCESSORS и используйте его в своем шаблоне следующим образом:

{{ current_path }}

Если вы хотите иметь полный объект request в каждом запросе, вы можете использовать встроенный Django.core.context_processors.request процессор контекста, а затем использовать {{ request.get_full_path }} в своем шаблоне.

Увидеть:

67
Sam Dolan

Используйте встроенный в контекстный процессор Django, чтобы получить запрос в контексте шаблона. В настройках добавьте request процессор к TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (

    # Put your context processors here

    'Django.core.context_processors.request',
)

И в шаблоне используйте:

{{ request.get_full_path }}

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

22
Mariusz Jamro

В файле context_processors.py (или подобном):

def myurl( request ):
  return { 'myurlx': request.get_full_path() }

В settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
  ...
  wherever_it_is.context_processors.myurl,
  ...

В вашем template.html:

myurl={{myurlx}}
7
eruciform

В дополнение к ответу Сдолана:

если вы используете I18N и хотели бы передать значение next в /i18n/setlang/ , чтобы изменить язык текущей страницы, то вам также понадобится удалить текущий код языка из полного пути. Что-то вроде:

full_path = request.get_full_path()
current_path = full_path[full_path.index('/', 1):]

Это предполагает, что каждый путь имеет формат /LANG_CODE/any/other/stuff/with/?param='yay' и просто запускает LANG_CODE, какой бы он ни был (например, /en/ приведет к /).

1
oblalex

Вы можете увидеть, если ваш URL отличается от других.

{% if 'foo/bar/' in request.get_full_path %}
1
sammarxz

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

Итак, в схеме MTV (Model, Template, View) представление получает запрос и использует шаблонный рендер для генерации ответа, передавая ему словарь или все локальные переменные (используя функцию locals ()) этого представления. Зная это, мы можем вставить текущий URL, полученный из ответа, например:

views.py:

from Django.shortcuts import render

def page(request):
    currentUrl = request.get_full_path()
    return render(request, 'app/page.html', locals())

Затем в шаблоне 'app/page.html' вам просто нужно сделать следующее, чтобы отобразить переменную currentUrl, которую мы только что создали и передали через locals ():

приложение/шаблон/page.html:

{{ currentUrl }}
1
Rafael Lopes