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


309

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

Скажите, что мой текущий URL:

.../user/profile/

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



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

Ответы:


232

Джанго 1.9 и выше:

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

Старый:

## 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, не упоминая другие процессоры по умолчанию, которые вполне могут быть использованы в шаблонах!
RedGlyph

8
С 2016 года вам больше не нужно ничего добавлять в views.py. Пока django.core.context_processors.request загружается в TEMPLATE_CONTEXT_PROCESSORS - у вас есть доступ к {{request.path}} из шаблона.
Routhinator

8
request.pathне включает параметры запроса, такие как ?foo=bar. Используйте request.get_full_pathвместо этого.
Flimm

@Routhinator согласен с вами. но приятно знать, что это промежуточное ПО должно быть включено, чтобы это произошло.
Маршал X Икс

281

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

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

или

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

Некоторые уточнения и исправления должны быть доведены до hypete - х и 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в контекст.
Боборт

Определенно чище, чтобы избежать жесткого кодирования списка 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
return render(request, 'user/profile.html', {'title': 'User profile'})короче
Ричард де Вит

2
не забудьте включить urlencode, т.е. {{request.get_full_path|urlenode}}если вы перенаправляете
пользователь

как получить параметры из get_full_path ??
номер


6

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

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


5

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

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

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


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

3

Оба {{ request.path }} and {{ request.get_full_path }}возвращают текущий URL, но не абсолютный, например:

your_website.com/wallpapers/new_wallpaper

Оба вернутся /new_wallpaper/ (обратите внимание на начальный и конечный слеш)

Так что вам придется сделать что-то вроде

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

Тем не менее, вы можете получить абсолютный URL, используя (благодаря ответу выше)

{{ request.build_absolute_uri }}

Примечание: Вы не должны включать requestв settings.py, это уже есть.


1

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

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

<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 }}
Квентин

0

Приведенные выше ответы верны и дают отличный и короткий ответ.

Я также искал для получения URL текущей страницы в шаблоне Django , как мое намерение было активировать HOME page, MEMBERS page, CONTACT page, ALL POSTS pageкогда они просят.

Я вставляю фрагмент кода HTML, который вы можете увидеть ниже, чтобы понять, как его использовать request.path. Вы можете увидеть это в моем live websiteна 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
Небольшое предложение - если все, что вы делаете, это проверяете, добавлять ли activeкласс к каждому liэлементу, почему бы просто не сделать это встроенным в один liэлемент: <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>вместо гигантского блока if / else для целого li? Это спасло бы целую кучу избыточного кода :)
Tatlar

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.