Djangoテンプレート内の現在のURLを取得するにはどうすればよいですか?


309

テンプレート内の現在のURLを取得する方法を考えていました。

私の現在のURLは次のとおりです:

.../user/profile/

これをテンプレートに戻すにはどうすればよいですか?



2
以下のすべての答えは、私requestがテンプレートでアクセスするためにいくつかの体操をする必要があると思いました。Django 1.10 {{request.path}}ではテンプレートにアクセスするだけで機能します。デフォルトでdjango.core.context_processors.requestは、使用した場合、settings.pyで既に構成されていますstartproject
ユーザー

回答:


232

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

2
少し簡潔で、正しくありません。それはrender_to_responseであり、ではありませんrender_to_request。またTEMPLATE_CONTEXT_PROCESSORS、テンプレートで使用できる他のデフォルトプロセッサについて言及せずに、settings.pyで定義するように定義することはできません。
RedGlyph 2012

8
2016年以降、views.pyに何かを追加する必要はありません。django.core.context_processors.requestがTEMPLATE_CONTEXT_PROCESSORSに読み込まれている限り、テンプレートから{{request.path}}にアクセスできます。
Routhinator 2016

8
request.pathのようなクエリパラメータは含まれません?foo=barrequest.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ため、コンテキストに追加する必要はありませんでした。
Bobort

TCPリストのハードコーディングを回避するために間違いなくよりクリーンですが、docs.djangoproject.com / en / dev / topics / settings /#defaultNote 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'})より短い
Richard de Wit

2
urlencodeを含めることを忘れ{{request.get_full_path|urlenode}}ないでください。つまり、リダイレクトする場合
ユーザー

get_full_pathからパラメーターを取得する方法
numerah 2014


6

djangoテンプレートでは 、パラメータ付きの完全なURLを
取得するには、単に現在のURLを{{request.path}}
取得します{{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ます。適切な解決策が見つからなかったので、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 }}

注:あなたは含める必要はありませんrequestsettings.py、それはすでにそこです。


1

これは古い質問ですが、django-registrationを使用している場合は、これと同じくらい簡単に要約できます。

[ログイン]および[ログアウト]リンク(ページヘッダーで言います)で、ログインまたはログアウトするリンクに次のパラメーターを追加します。リンクは次のようになります。

<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

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

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

HTMLコードスニペットの一部を貼り付けています。このコードスニペットは、の使用を理解するために以下に表示されますrequest.path。あなたは私の中でそれを見ることができるlive websitehttp://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要素に追加するかどうかをチェックしているなら、なぜそれを1つのli要素内でインライン化しないのですか?<li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>全体の巨大なif / elseブロックの代わりにli?それは冗長なコードの束全体を節約するでしょう:)
tatlar

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.