Jak uzyskać bieżący adres URL w szablonie Django?

309

Zastanawiałem się, jak uzyskać bieżący adres URL w szablonie.

Powiedz, że mój obecny adres URL to:

.../user/profile/

Jak mogę to zwrócić do szablonu?

rozsiany
źródło
3
możliwy duplikat Ścieżki czytania w szablonach
Mark Mikofski
2
Wszystkie poniższe odpowiedzi sprawiły, że pomyślałem, że muszę zrobić gimnastykę, aby uzyskać dostęp do requestszablonu. W Django 1.10 po prostu uzyskuję dostęp {{request.path}}do szablonu i działa. Domyślnie django.core.context_processors.requestjest już skonfigurowany w settings.py, jeśli go użyłeśstartproject
Użytkownik

Odpowiedzi:

232

Django 1.9 i nowszy:

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

Stary:

## 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 }}
httpete
źródło
2
Trochę lakoniczny i niepoprawny. To jest render_to_responsei nie render_to_request. I nie możesz zdefiniować, TEMPLATE_CONTEXT_PROCESSORSjak to robisz w settings.py, nie wspominając o innych domyślnych procesorach, które mogą być dobrze wykorzystane w szablonach!
RedGlyph
8
Od 2016 r. Nie trzeba już dodawać niczego do views.py. Tak długo, jak django.core.context_processors.request jest ładowany do TEMPLATE_CONTEXT_PROCESSORS - masz dostęp do {{request.path}} z szablonu.
Routhinator 24.04.16
8
request.pathnie obejmuje parametrów zapytania takich jak ?foo=bar. Użyj request.get_full_pathzamiast tego.
Flimm,
@Routhinator zgadza się z tobą. ale miło jest wiedzieć, że aby to się stało, należy dołączyć to oprogramowanie pośrednie.
Marshall X
281

Możesz pobrać adres URL z szablonu w następujący sposób:

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

lub przez

{{ request.path }} jeśli nie potrzebujesz dodatkowych parametrów.

Należy uściślić pewne szczegóły i poprawki w odpowiedziach hypete'a i Igancio. Po prostu streszczę tutaj cały pomysł, do przyszłego wykorzystania.

Jeśli potrzebujesz requestzmiennej w szablonie, musisz dodać „django.core.context_processors.request” do TEMPLATE_CONTEXT_PROCESSORSustawień, nie jest to domyślnie (Django 1.4).

Nie wolno również zapominać o innych procesorach kontekstowych używanych przez aplikacje. Tak więc, aby dodać żądanie do innych domyślnych procesorów, możesz dodać to w swoich ustawieniach, aby uniknąć zakodowania na stałe domyślnej listy procesorów (co może się bardzo zmienić w późniejszych wersjach):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

Następnie pod warunkiem przesłania requesttreści w odpowiedzi , na przykład w następujący sposób:

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)
    )
RedGlyph
źródło
4
Użyłem rozszerzonego ogólnego widoku klasy i nie było potrzeby dodawania requestdo kontekstu.
Bobort
Zdecydowanie czystsze, aby uniknąć twardego kodowania listy TCP, ale docs.djangoproject.com/en/dev/topics/settings/#default-settings mówi:Note that a settings file should not import from global_settings, because that’s redundant
użytkownik
3
return render(request, 'user/profile.html', {'title': 'User profile'})jest krótszy
Richard de Wit
2
pamiętaj, aby podać kod url, tj. {{request.get_full_path|urlenode}}jeśli przekierowujesz
użytkownik
jak uzyskać parametry z get_full_path ??
numerah
7

Poniższy kod pomaga mi:

 {{ request.build_absolute_uri }}
Евгений Шабин
źródło
Jest to przydatne, ponieważ obejmuje również nazwę hosta / domenę.
waverider
6

W szablonie django
Po prostu pobierz aktualny adres URL {{request.path}}
Aby uzyskać pełny adres URL z parametrami{{request.get_full_path}}

Uwaga : Musisz dodać requestw djangoTEMPLATE_CONTEXT_PROCESSORS

Savad KP
źródło
5

Przypuszczam, że pełne przesłanie żądania do szablonu jest trochę zbędne. Robię to w ten sposób

from django.shortcuts import render

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

##template
{{ app_url }}
Radren
źródło
4

Pozostałe odpowiedzi były niepoprawne, przynajmniej w moim przypadku. request.pathnie podaje pełnego adresu URL, tylko względny adres URL, np /paper/53. Nie znalazłem żadnego właściwego rozwiązania, więc ostatecznie skonkodowałem stałą część adresu URL w widoku przed połączeniem go request.path.

Deleet
źródło
Spójrz na datę. Odpowiedzi udzielono 6 lub 7 lat temu.
dotty
3

Oba {{ request.path }} and {{ request.get_full_path }}zwracają bieżący adres URL, ale nie bezwzględny adres URL, na przykład:

twoja_website.com/wallpapers/new_wallpaper

Oba powrócą /new_wallpaper/ (zauważ początkowe i końcowe ukośniki)

Więc musisz zrobić coś takiego

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

Możesz jednak uzyskać bezwzględny adres URL za pomocą (dzięki powyższej odpowiedzi)

{{ request.build_absolute_uri }}

UWAGA: nie trzeba włączyć requestw settings.py, to już tam jest.

Mujeeb Ishaque
źródło
1

To stare pytanie, ale można je tak łatwo podsumować, jeśli używasz rejestracji django.

W swoim linku Zaloguj się i Wyloguj (powiedzmy w nagłówku strony) dodaj następny parametr do linku, który przejdzie do logowania lub wylogowania. Twój link powinien wyglądać następująco.

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

Po prostu nic więcej nie trzeba robić, po wylogowaniu zostaną natychmiast przekierowani na stronę, na której się znajdują, aby się zalogować, wypełnią formularz, a następnie przekierują na stronę, na której byli. Nawet jeśli nieprawidłowo spróbują się zalogować, nadal działa.

Chris Hawkes
źródło
3
należy zakodować ścieżkę, jeśli jest ona w adresie URL:{{ request.path|urlencode }}
Quentin,
0

Powyższe odpowiedzi są poprawne i dają świetną i krótką odpowiedź.

Ja również poszukuje coraz URL bieżącej strony w szablonie Django jako moją intencją było, aby uaktywnić HOME page, MEMBERS page, CONTACT page, ALL POSTS pagegdy są one wymagane.

Wklejam fragment fragmentu kodu HTML, który możesz zobaczyć poniżej, aby zrozumieć jego użycie request.path. Możesz to zobaczyć w moim live websitena 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>

Hygull
źródło
2
Mała sugestia - jeśli wszystko, co robisz, to sprawdzanie, czy dodać activeklasę do każdego lielementu, dlaczego po prostu nie zrobić tego w jednym lielemencie: <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>zamiast gigantycznego bloku if / else dla całości li?
Pozwoliłoby
0

W Django 3 chcesz użyć tagu szablonu adresu URL :

{% url 'name-of-your-user-profile-url' possible_context_variable_parameter %}

Na przykład zobacz dokumentację

Janne
źródło