Djangoのテンプレートで現在のURLを取得する方法をご紹介します。
目次
条件
- Django 2.1.3
- Python 3.7.0
テンプレートでの現在URLの記述
以下、4通りの方法があります。
- {{ request.path }}
- {{ request.get_full_path }}
- {{ request.get_full_path_info }}
- {{ request.get_full_path_info }}
実際の例
現在のURLが以下の場合
http://127.0.0.1:8123/accounts/login/?next=/
{{ request.path }}
/accounts/login/
{{ request.get_full_path }}
/accounts/login/?next=/
{{ request.get_full_path_info }}
/accounts/login/?next=/
{{ request.build_absolute_uri }}
http://127.0.0.1:8123/accounts/login/?next=/
pathとpath_infoの違い
Djangoのドキュメントには以下のように記述されていました。
「path_info」を使用した方が問題が起きにくくなって、より良いようです。
HttpRequest.path
リクエストされたページへのフルパスを表す文字列です。スキーマやドメインは含みません。
例: “/music/bands/the_beatles/”
HttpRequest.path_info
ウェブサーバーの設定によっては、ホスト名の後ろの URL の部分が、スクリプト接頭辞部分とパス情報部分に分離されることがあります。path_info 属性には、どんなウェブサーバを使用していても常に、パスのパス情報部分が含まれます。path ではなくこの属性を使用することで、テストサーバとデプロイサーバ間の移動で問題が起こりにくいコードになります。
たとえば、アプリケーションの WSGIScriptAlias が “/minfo” に設定されている場合、path が “/minfo/music/bands/the_beatles/” である一方、path_info は “/music/bands/the_beatles/” となる可能性があります。
参考
https://docs.djangoproject.com/ja/2.1/ref/request-response/#django.http.HttpRequest.path
使用例
現在のURLをテンプレートで確認することにより、ヘッダーメニューに現在URLのリンクを表示させないという制御を行うことが出来ます。
何も制御を行わない場合
<!-- base.html抜粋 --> <li class="nav-item"> <a class="nav-link" href="{% url 'monitor:password_reset' %}">パスワードリセット</a> </li> <li class="nav-item"> <a class="nav-link" href="{% url 'login' %}" class="login">ログイン</a> </li>
ログイン画面、パスワードリセット画面それぞれで、ヘッダーメニューに「ログイン」「パスワードリセット」リンクが表示されます。
現在URLリンクを表示させない制御を行う場合
<!-- base.html抜粋 --> {% url 'monitor:password_reset' as password_reset %} {% ifnotequal request.path password_reset %} <li class="nav-item"> <a class="nav-link" href="{% url 'monitor:password_reset' %}">パスワードリセット</a> </li> {% endifnotequal %} {% url 'login' as login %} {% ifnotequal request.path login %} <li class="nav-item"> <a class="nav-link" href="{% url 'login' %}" class="login">ログイン</a> </li> {% endifnotequal %}
ログイン画面ではヘッダーメニューに「パスワードリセット」、パスワードリセット画面ではヘッダーメニューに「ログイン」リンクのみが表示されるようになります。