จะรับ URL ปัจจุบันในเทมเพลต Django ได้อย่างไร


309

ฉันสงสัยว่าจะรับ URL ปัจจุบันได้อย่างไรในเทมเพลต

สมมติว่า URL ปัจจุบันของฉันคือ:

.../user/profile/

ฉันจะคืนค่านี้ไปยังเทมเพลตได้อย่างไร


3
สำเนาซ้ำเป็นไปได้ของเส้นทางการอ่านในเทมเพลต
Mark Mikofski

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

8
ตั้งแต่ปี 2559 คุณไม่จำเป็นต้องเพิ่มอะไรไปยัง 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 }} หากคุณไม่ต้องการพารามิเตอร์เพิ่มเติม

ความแม่นยำและการแก้ไขบางอย่างควรนำมาซึ่งการสะกดจิตและการอิกซิโอคำตอบผมจะสรุปความคิดทั้งหมดที่นี่เพื่ออ้างอิงในอนาคต

หากคุณต้องการ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
ผู้ใช้

3
return render(request, 'user/profile.html', {'title': 'User profile'})สั้นกว่า
Richard de Wit

2
อย่าลืมใส่ urlencode เช่น{{request.get_full_path|urlenode}}หากคุณเปลี่ยนเส้นทาง
ผู้ใช้

วิธีรับพารามิเตอร์จาก get_full_path
ตัวเลข


6

ใน django template
เพียงแค่รับ url ปัจจุบันจาก{{request.path}}
เพื่อรับ url ที่เต็มไปด้วยพารามิเตอร์{{request.get_full_path}}

หมายเหตุ : คุณต้องเพิ่มrequestใน djangoTEMPLATE_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ที่เกี่ยวข้องเช่น ฉันไม่พบทางออกที่เหมาะสมใด ๆ ดังนั้นฉันสิ้นสุด hardcoding ส่วนที่คงที่ของ 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

นี่เป็นคำถามเก่า แต่สามารถสรุปได้อย่างง่ายดายเช่นนี้หากคุณใช้การลงทะเบียน 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>

เพียง แต่ไม่ต้องทำสิ่งใดเมื่อออกจากระบบพวกเขาจะถูกเปลี่ยนเส้นทางไปยังหน้าเว็บที่พวกเขาอยู่ทันทีเพื่อเข้าสู่ระบบพวกเขาจะกรอกแบบฟอร์มและจากนั้นจะเปลี่ยนเส้นทางไปยังหน้าเว็บที่พวกเขาอยู่ แม้ว่าพวกเขาจะพยายามเข้าสู่ระบบไม่ถูกต้องก็ยังคงใช้งานได้


3
คุณควรเข้ารหัสเส้นทางถ้ามันอยู่ใน URL ที่:{{ request.path|urlencode }}
เควนติน

0

คำตอบข้างต้นนั้นถูกต้องและพวกเขาให้คำตอบที่ดีและสั้น

ผมยังมองในการรับ URL หน้าปัจจุบันใน Django แม่แบบเป็นความตั้งใจของผมคือการเปิดใช้งาน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
ข้อเสนอแนะเล็ก ๆ - ถ้าสิ่งที่คุณทำคือการตรวจสอบว่าจะเพิ่มactiveคลาสในแต่ละliองค์ประกอบทำไมไม่เพียงทำแบบอินไลน์ภายในliองค์ประกอบเดียว: <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>แทนที่จะเป็นยักษ์ถ้า / อื่นบล็อกทั้งหมดli? ที่จะช่วยประหยัดทั้งกลุ่มของรหัสซ้ำซ้อน :)
tatlar

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.