Bagaimana cara mendapatkan URL saat ini dalam template Django?


309

Saya bertanya-tanya bagaimana cara mendapatkan URL saat ini dalam sebuah template.

Katakan URL saya saat ini adalah:

.../user/profile/

Bagaimana cara mengembalikan ini ke templat?


3
kemungkinan duplikat jalur Bacaan di templat
Mark Mikofski

2
Semua jawaban di bawah ini membuat saya berpikir saya perlu melakukan beberapa senam untuk mendapatkan akses ke requestdalam template. Di Django 1.10 saya hanya mengakses {{request.path}}di template dan itu berfungsi. Secara default django.core.context_processors.requestsudah dikonfigurasi di settings.py jika Anda menggunakanstartproject
Pengguna

Jawaban:


232

Django 1.9 dan lebih tinggi:

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

Tua:

## 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
Agak singkat, dan tidak benar. Itu render_to_response, dan tidak render_to_request. Dan Anda tidak dapat mendefinisikan TEMPLATE_CONTEXT_PROCESSORSseperti yang Anda lakukan di settings.py, tanpa menyebutkan prosesor default lain yang mungkin digunakan dalam templat!
RedGlyph

8
Mulai 2016, Anda tidak perlu lagi menambahkan apa pun ke views.py. Selama django.core.context_processors.request dimuat dalam TEMPLATE_CONTEXT_PROCESSORS - Anda memiliki akses ke {{request.path}} dari template.
Routhinator

8
request.pathtidak termasuk parameter kueri suka ?foo=bar. Gunakan request.get_full_pathsebagai gantinya.
Flimm

@Routhinator setuju dengan Anda. tapi senang mengetahui bahwa middleware tersebut perlu dimasukkan untuk mewujudkannya.
Marshall X

281

Anda dapat mengambil URL di templat Anda seperti ini:

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

atau oleh

{{ request.path }} jika Anda tidak memerlukan parameter tambahan.

Beberapa persiapan dan koreksi harus dibawa ke jawaban hypete dan Igancio , saya hanya akan meringkas seluruh ide di sini, untuk referensi di masa mendatang.

Jika Anda memerlukan requestvariabel dalam templat, Anda harus menambahkan 'django.core.context_processors.request' ke TEMPLATE_CONTEXT_PROCESSORSpengaturan, itu tidak secara default (Django 1.4).

Anda juga harus tidak melupakan prosesor konteks lain yang digunakan oleh aplikasi Anda. Jadi, untuk menambahkan permintaan ke prosesor default lain, Anda bisa menambahkan ini di pengaturan Anda, untuk menghindari pengodean daftar prosesor default (yang mungkin berubah di versi yang lebih baru):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

Kemudian, asalkan Anda mengirim requestkonten dalam respons Anda , misalnya seperti ini:

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
Saya menggunakan tampilan kelas umum yang diperluas, dan itu tidak perlu untuk menambah requestkonteks.
Bobort

Jelas lebih bersih untuk menghindari pengodean daftar TCP, tetapi docs.djangoproject.com/en/dev/topics/settings/#default-settings mengatakan:Note that a settings file should not import from global_settings, because that’s redundant
pengguna

3
return render(request, 'user/profile.html', {'title': 'User profile'})lebih pendek
Richard de Wit

2
ingatlah untuk memasukkan urlencode yaitu {{request.get_full_path|urlenode}}jika Anda mengarahkan ulang
pengguna

bagaimana cara mendapatkan parameter dari get_full_path ??
numerah


6

Dalam template Django
Cukup dapatkan url saat ini dari {{request.path}}
Untuk mendapatkan url penuh dengan parameter{{request.get_full_path}}

Catatan : Anda harus menambahkan requestdjangoTEMPLATE_CONTEXT_PROCESSORS


5

Saya kira kirim ke templat permintaan penuh sedikit berlebihan. Saya melakukannya dengan cara ini

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

Jawaban lainnya salah, setidaknya dalam kasus saya. request.pathtidak menyediakan url lengkap, hanya url relatif, mis /paper/53. Saya tidak menemukan solusi yang tepat, jadi saya akhirnya meng-hardcoding bagian konstan url di View sebelum menyatukannya request.path.


Lihatlah tanggalnya. Jawabannya diberikan 6 atau 7 tahun yang lalu.
Dotty

3

Keduanya {{ request.path }} and {{ request.get_full_path }}mengembalikan URL saat ini tetapi bukan URL absolut, misalnya:

your_website.com/wallpaper/new_wallpaper

Keduanya akan kembali /new_wallpaper/ (perhatikan garis miring depan dan belakang)

Jadi, Anda harus melakukan sesuatu seperti

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

Namun, Anda bisa mendapatkan URL absolut menggunakan (berkat jawaban di atas)

{{ request.build_absolute_uri }}

CATATAN: Anda tidak perlu menyertakan requestdalam settings.py, itu sudah ada.


1

Ini adalah pertanyaan lama tetapi dapat disimpulkan semudah ini jika Anda menggunakan registrasi Django.

Di tautan Masuk dan Keluar (katakanlah di tajuk laman), tambahkan parameter berikutnya ke tautan yang akan masuk atau keluar. Tautan Anda akan terlihat seperti ini.

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

Hanya itu, tidak ada lagi yang perlu dilakukan, setelah logout mereka akan segera diarahkan ke halaman mereka, untuk login, mereka akan mengisi formulir dan kemudian akan mengarahkan ulang ke halaman tempat mereka berada. Bahkan jika mereka salah mencoba login masih berfungsi.


3
Anda harus menyandikan jalannya jika ada di url:{{ request.path|urlencode }}
Quentin

0

Jawaban di atas adalah benar dan mereka memberikan jawaban yang bagus dan singkat.

Saya juga mencari mendapatkan url halaman saat ini dalam template Django sebagai niat saya adalah untuk mengaktifkan HOME page, MEMBERS page, CONTACT page,ALL POSTS page ketika mereka diminta.

Saya menempelkan bagian dari potongan kode HTML yang dapat Anda lihat di bawah untuk memahami penggunaan request.path. Anda dapat melihatnya live websitedi 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
Saran kecil - jika semua yang Anda lakukan adalah memeriksa apakah akan menambahkan activekelas ke setiap lielemen, mengapa tidak hanya melakukan inline dalam satu lielemen: <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>alih-alih raksasa jika / yang lain memblokir keseluruhan li? Itu akan menghemat sejumlah kode redundan :)
tatlar

0

Di Django 3, Anda ingin menggunakan tag template url :

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

Sebagai contoh, lihat dokumentasi

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.