Як отримати поточну URL-адресу в шаблоні Django?


309

Мені було цікаво, як отримати поточну URL-адресу в шаблоні.

Скажіть, моя поточна URL-адреса:

.../user/profile/

Як повернути це до шаблону?



2
Усі наведені нижче відповіді змусили мене думати, що мені потрібно зробити гімнастику, щоб отримати доступ до requestшаблону. У Django 1.10 я просто отримую доступ {{request.path}}до шаблону, і він працює. За замовчуванням django.core.context_processors.requestвже налаштовано в settings.py, якщо ви використовувалиstartproject
Користувач

Відповіді:


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 рік вам більше не потрібно додавати нічого в view.py. Поки django.core.context_processors.request завантажується в TEMPLATE_CONTEXT_PROCESSORS - у вас є доступ до {{request.path}} з шаблону.
Ротатор

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 }} якщо вам не потрібні додаткові параметри.

Деякі точності та виправлення повинні бути внесені до відповідей підказки та Ігансіо , я просто підсумую всю цю ідею тут, для подальшого ознайомлення.

Якщо вам потрібна requestзмінна в шаблоні, ви повинні додати до TEMPLATE_CONTEXT_PROCESSORSналаштувань 'django.core.context_processors.request' , це не за замовчуванням (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-адресу, але не абсолютну 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.