Làm cách nào để lấy URL hiện tại trong mẫu Django?


309

Tôi đã tự hỏi làm thế nào để có được URL hiện tại trong một mẫu.

Nói rằng URL hiện tại của tôi là:

.../user/profile/

Làm thế nào để tôi trả lại cái này cho mẫu?



2
Tất cả các câu trả lời dưới đây khiến tôi nghĩ rằng tôi cần phải thực hiện một số bài thể dục để có quyền truy cập requestvào một mẫu. Trong Django 1.10 tôi chỉ cần truy cập {{request.path}}trong mẫu và nó hoạt động. Theo mặc định django.core.context_processors.requestđã được định cấu hình trong settings.py nếu bạn đã sử dụngstartproject
Người dùng

Câu trả lời:


232

Django 1.9 trở lên:

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

Cũ:

## 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
Một chút laconic, và không chính xác. Đó là render_to_response, và không render_to_request. Và bạn không thể xác định TEMPLATE_CONTEXT_PROCESSORSnhư bạn làm trong settings.txt, mà không đề cập đến các bộ xử lý mặc định khác có thể được sử dụng trong các mẫu!
RedGlyph

8
Kể từ năm 2016, bạn không còn cần phải thêm bất cứ điều gì vào view.py. Miễn là django.core.context_ Processors.request được tải trong TEMPLATE_CONTEXT_PROCESSORS - bạn có quyền truy cập vào {{request.path}} từ mẫu.
Routhinator

8
request.pathkhông bao gồm các tham số truy vấn như ?foo=bar. Sử dụng request.get_full_paththay thế.
Flimm

@Routhinator đồng ý với bạn. nhưng thật tuyệt khi biết rằng những phần mềm trung gian đó cần được đưa vào để thực hiện điều này.
Marshall X

281

Bạn có thể tìm nạp URL trong mẫu của bạn như thế này:

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

hoặc bằng cách

{{ request.path }} nếu bạn không cần thêm thông số.

Một số độ chính xác và điều chỉnh nên được đưa đến hypete củaIgancio của câu trả lời, tôi sẽ chỉ tóm tắt toàn bộ ý tưởng ở đây, để tham khảo trong tương lai.

Nếu bạn cần requestbiến trong mẫu, bạn phải thêm 'django.core.context_ Processors.request' vào TEMPLATE_CONTEXT_PROCESSORScài đặt, không phải theo mặc định (Django 1.4).

Bạn cũng không được quên các bộ xử lý bối cảnh khác được sử dụng bởi các ứng dụng của bạn. Vì vậy, để thêm yêu cầu vào các bộ xử lý mặc định khác, bạn có thể thêm yêu cầu này vào cài đặt của mình, để tránh mã hóa cứng danh sách bộ xử lý mặc định (có thể thay đổi rất tốt trong các phiên bản sau):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

Sau đó, miễn là bạn gửi requestnội dung trong phản hồi của mình , ví dụ như sau:

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
Tôi đã sử dụng một khung nhìn lớp chung mở rộng và không cần thiết phải thêm requestvào ngữ cảnh.
Bobort

Chắc chắn sạch hơn để tránh mã hóa cứng danh sách TCP, nhưng docs.djangoproject.com/en/dev/topics/sinstall/#default-sinstall nói:Note that a settings file should not import from global_settings, because that’s redundant
người dùng

3
return render(request, 'user/profile.html', {'title': 'User profile'})ngắn hơn
Richard de Wit

2
nhớ bao gồm urlencode tức là {{request.get_full_path|urlenode}}nếu bạn đang chuyển hướng
người dùng

Làm thế nào để có được tham số từ get_full_path ??
Numah

7

Đoạn mã dưới đây giúp tôi:

 {{ request.build_absolute_uri }}

Điều này rất hữu ích, vì nó cũng bao gồm tên máy chủ / tên miền.
waverider

6

Trong mẫu django
Chỉ cần lấy url hiện tại từ {{request.path}}
Để nhận url đầy đủ với các tham số{{request.get_full_path}}

Lưu ý : Bạn phải thêm requestvào djangoTEMPLATE_CONTEXT_PROCESSORS


5

Tôi cho rằng gửi đến mẫu yêu cầu đầy đủ là một chút dư thừa. Tôi làm theo cách này

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

Các câu trả lời khác là không chính xác, ít nhất là trong trường hợp của tôi. request.pathkhông cung cấp url đầy đủ, chỉ có url tương đối, vd /paper/53. Tôi không tìm thấy bất kỳ giải pháp thích hợp nào, vì vậy tôi đã kết thúc việc mã hóa phần không đổi của url trong Chế độ xem trước khi nối nó với request.path.


Nhìn vào ngày. Các câu trả lời đã được đưa ra 6 hoặc 7 năm trước.
chấm

3

Cả hai đều {{ request.path }} and {{ request.get_full_path }}trả về URL hiện tại nhưng không phải là URL tuyệt đối, ví dụ:

your_website.com/wall Vogue / new_wallapers

Cả hai sẽ trở lại /new_wallpaper/ (chú ý dấu gạch chéo hàng đầu và dấu)

Vì vậy, bạn sẽ phải làm một cái gì đó như

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

Tuy nhiên, bạn có thể nhận được URL tuyệt đối bằng cách sử dụng (nhờ câu trả lời ở trên)

{{ request.build_absolute_uri }}

LƯU Ý: bạn không cần phải đưa requestvào settings.py, nó đã ở đó.


1

Đây là một câu hỏi cũ nhưng nó có thể được tóm tắt dễ dàng như thế này nếu bạn đang sử dụng đăng ký django.

Trong liên kết Đăng nhập và Đăng xuất của bạn (giả sử trong tiêu đề trang của bạn) thêm tham số tiếp theo vào liên kết sẽ đăng nhập hoặc đăng xuất. Liên kết của bạn sẽ trông như thế này.

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

Điều đó chỉ đơn giản là không cần phải làm gì nữa, khi đăng xuất, họ sẽ ngay lập tức được chuyển hướng đến trang họ đang ở, để đăng nhập, họ sẽ điền vào biểu mẫu và sau đó sẽ chuyển hướng đến trang mà họ đang truy cập. Ngay cả khi họ cố gắng đăng nhập không chính xác, nó vẫn hoạt động.


3
bạn nên mã hóa đường dẫn nếu nó nằm trong một url:{{ request.path|urlencode }}
Quentin

0

Trên câu trả lời là chính xác và họ đưa ra câu trả lời tuyệt vời và ngắn.

Tôi cũng đang tìm kiếm để có được url của trang hiện tại trong Django mẫu như ý định của tôi là để kích hoạt HOME page, MEMBERS page, CONTACT page, ALL POSTS pagekhi họ được yêu cầu.

Tôi đang dán một phần của đoạn mã HTML mà bạn có thể thấy bên dưới để hiểu cách sử dụng request.path. Bạn có thể thấy điều đó trong tôi live websitetại 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
Một gợi ý nhỏ - nếu tất cả những gì bạn đang làm là kiểm tra xem có nên thêm activelớp vào từng liphần tử hay không, tại sao không thực hiện nội tuyến đó trong một liphần tử: <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>thay vì khối if / other khổng lồ cho toàn bộ li? Điều đó sẽ tiết kiệm được cả đống mã dự phòng :)
tatlar

0

Trong Django 3, bạn muốn sử dụng thẻ mẫu url :

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

Ví dụ, xem tài liệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.