Django 템플릿 내에서 현재 URL을 얻는 방법은 무엇입니까?


309

템플릿 내에서 현재 URL을 얻는 방법이 궁금합니다.

현재 URL이 다음과 같다고 가정 해 보겠습니다.

.../user/profile/

템플릿으로 어떻게 되 돌리나요?



2
아래의 모든 대답은 request템플릿에 액세스하기 위해 체조를해야한다고 생각했습니다 . Django 1.10에서는 {{request.path}}템플릿에 액세스 하면 작동합니다. django.core.context_processors.requeststartproject
사용자가

답변:


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 }} 추가 매개 변수가 필요하지 않은 경우

일부 정확성과 수정은 hypeteIgancio의 답변으로 가져와야 합니다. 나중에 참조 할 수 있도록 여기에 전체 아이디어를 요약하겠습니다.

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를 사용했으며 컨텍스트 에 추가 할 필요가 없었습니다 .
Bobort

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
user

3
return render(request, 'user/profile.html', {'title': 'User profile'})짧은
리처드 드 위트

2
urlencode를 포함 {{request.get_full_path|urlenode}}해야합니다. 즉 , 경로를 재지 정하는 경우
사용자

get_full_path에서 매개 변수를 얻는 방법 ??
numerah


6

django 템플릿
에서 {{request.path}}
매개 변수로 전체 URL을 얻으려면에서 현재 URL을 가져옵니다.{{request.get_full_path}}

참고 : requestdjango 를 추가해야합니다TEMPLATE_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. 적절한 해결책을 찾지 못했기 때문에 View에 URL의 상수 부분을 하드 코딩하여에 연결했습니다 request.path.


날짜를보십시오. 답은 6 ~ 7 년 전에 주어졌습니다.
dotty

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

이것은 오래된 질문이지만 장고 등록을 사용하는 경우 쉽게 요약 할 수 있습니다.

로그인 및 로그 아웃 링크 (페이지 헤더에 표시)에서 다음 매개 변수를 링크에 추가하면 로그인 또는 로그 아웃으로 이동합니다. 귀하의 링크는 다음과 같아야합니다.

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

0

위의 답변은 정확하며 훌륭하고 짧은 답변을 제공합니다.

나는 또한 나의 의도를 활성화했다 장고 템플릿에 현재 페이지의 URL을 점점 찾고 있었다 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
작은 제안-당신이하고있는 모든 것이 activeli요소에 클래스 를 추가할지 여부를 확인하는 것이라면 , 하나의 li요소 내에서 인라인을 수행하는 <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>것이 li어떻습니까? 전체에 거대한 if / else 블록 대신 ? 즉 :) 중복 코드의 전체 무리 절약 할 수
tatlar

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.