web-dev-qa-db-ja.com

Djangoテンプレート内の現在のURLを取得する方法

テンプレート内で現在のURLを取得する方法について疑問に思いました。

現在のURLが次のようになっているとします。

.../user/profile/

これをテンプレートに戻す方法は?

272
dotty

Django 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 }}
172
httpete

あなたはこのようにあなたのテンプレートのURLを取得することができます:

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

またはによって

追加のパラメータが不要な場合は{{ request.path }}

いくつかの正確さと修正は hypete'sIgancio's の答えにもたらされるべきです、私は将来の参考のためにここで全体の考えを要約するつもりです。

テンプレートにrequest変数が必要な場合は、 must に '[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)
    )
277
RedGlyph

テンプレートへのフルリクエストの送信は少し冗長です。こうやって

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

##template
{{ app_url }}
5
Radren

Djangoテンプレート内
{{request.path}}から現在のURLを取得するだけです。
パラメータ{{request.get_full_path}}で完全なURLを取得するため

:Djangoにrequestを追加する必要がありますTEMPLATE_CONTEXT_PROCESSORS

5
Savad KP

少なくとも私の場合、他の答えは間違っていました。 request.pathは、完全なURLではなく相対URLのみを提供します。 /paper/53。私は適切な解決策を見つけられなかったので、私はそれをrequest.pathと連結する前にビューの中のurlの定数部分をハードコーディングすることになった。

3
Deleet

これは古い質問ですが、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>

それだけで、他に何もする必要はありません。ログアウトするとすぐに現在のページにリダイレクトされます。ログインの場合はフォームに記入してから自分がいたページにリダイレクトします。彼らが誤ってログインしようとしても、それでも動作します。

1
Chris Hawkes

上記の答えは正しいです、そして彼らは素晴らしいそして短い答えを与えます。

私の意図はHOME pageMEMBERS pageCONTACT pageALL POSTS pageが要求されたときにアクティブにすることだったので、私はDjangoテンプレートで現在のページのURLを取得することも探していました。

request.pathの使用方法を理解するために、以下に示すHTMLコードの一部を貼り付けています。あなたは私の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>
0
hygull