Làm cách nào để lấy tên url hiện tại bằng Django?


90

Tôi phải tạo một url động theo url hiện tại. Sử dụng {% url %}thẻ là cách dễ nhất để làm điều đó, nhưng tôi cần tên url hiện tại để tạo động mới.

Làm cách nào để tôi có thể gắn tên url vào urlconf dẫn đến chế độ xem hiện tại?

CHỈNH SỬA: Tôi biết tôi có thể tạo thủ công url bằng cách sử dụng get_absolute_urlnhưng tôi muốn tránh nó vì nó là một phần của bài giảng và tôi chỉ muốn trình bày một cách để tạo url.

Các học sinh biết cách sử dụng {% url %}. Họ biết phải đối mặt với một vấn đề khi họ phải tạo một url hoàn chỉnh hơn dựa trên url hiện tại. Cách đơn giản nhất là sử dụng {% url %}lại, với một số biến thể. Vì chúng tôi đã đặt tên url, chúng tôi cần biết cách lấy tên của url được gọi là chế độ xem hiện tại.

CHỈNH SỬA 2: một trường hợp sử dụng khác là hiển thị các phần của mẫu cơ sở khác nhau tùy theo mẫu cơ sở. Có những cách khác để làm điều đó (sử dụng CSS và {% block%}, nhưng đôi khi thật tuyệt khi có thể xóa thẻ của mục nhập menu base.html nếu tên chế độ xem khớp với liên kết.


6
Tôi tiếp tục tìm thấy câu hỏi này trong khi tìm kiếm cách xuất url hiện tại, tuyệt đối thông qua thẻ mẫu ... nếu bạn cũng đang tìm kiếm điều đó, đó là:{{ request.get_full_path }}
Dolph

Câu trả lời:


134

Tôi không biết tính năng này đã là một phần của Django được bao lâu nhưng như bài viết sau cho thấy, nó có thể đạt được như sau trong khung nhìn:

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

Nếu bạn cần điều đó trong mọi mẫu, viết một yêu cầu mẫu có thể phù hợp.

Chỉnh sửa: ÁP DỤNG CẬP NHẬT DJANGO MỚI

Theo bản cập nhật Django hiện tại:

Django 1.10 ( liên kết )

Tính năng nhập từ django.core.urlresolversmô-đun không được dùng nữa vì vị trí mới của nó,django.urls

Django 2.0 ( liên kết )

Các django.core.urlresolversmô-đun được lấy ra có lợi cho vị trí mới, django.urls.

Vì vậy, cách đúng để làm là như sau:

from django.urls import resolve
current_url = resolve(request.path_info).url_name

Tại sao? Theo như tôi đã hiểu câu hỏi của bạn, một phần quan trọng của nó là làm thế nào để đạt được "Vì chúng tôi đã đặt tên url, chúng tôi cần biết cách lấy tên của url được gọi là chế độ xem hiện tại." ...
Lukas Bünger

1
Thật ra hôm đó tôi đã gắt gỏng và loại bỏ câu trả lời của bạn một cách hoàn toàn tùy tiện. Tôi xin lỗi, vì đây thực sự là câu trả lời đúng. tôi sẽ chỉnh sửa nó để làm cho nó đẹp hơn.
e-thoả mãn

8
resolve()không thể giải quyết nếu bạn chuyển nó một chuỗi truy vấn và chỉ cần tăng 404. get_full_path()trả về đường dẫn và chuỗi truy vấn. Bạn sẽ cần sử dụng resolve(request.path_info).
Can Burak Çilingir

Điều gì sẽ xảy ra nếu đó không phải là currenturl cần được giải quyết, mà là url mà người dùng sẽ chuyển hướng đến? Cách chung chung hơn để thực hiện điều này là gì? Câu trả lời của Conley Owens có manh mối, nhưng tôi không muốn phát minh lại bánh xe nếu bánh xe đã nói đã tồn tại ở Django dưới mui xe.
Hassan Baig

Đây dường như không làm việc cho các url thể dịch với i18n_patterns
guival

109

Kể từ Django 1.5, điều này có thể được truy cập từ đối tượng yêu cầu

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match


Khi tôi đặt điều này vào một bộ xử lý ngữ cảnh, nó đã hoạt động, nhưng lỗi kỳ lạ này được hiển thị trong bảng điều khiển:AttributeError: 'WSGIRequest' object has no attribute 'resolver_match'
fjsj

2
'Resolutionver_match' chỉ được thêm vào đối tượng yêu cầu sau khi gọi tất cả phần mềm trung gian yêu cầu. Đó là khi các url được giải quyết. Vì vậy, bạn chỉ có thể truy cập từ xem phần mềm trung gian trở đi. (các chức năng process_view của phần mềm trung gian). Nó sẽ không có sẵn trong các chức năng phần mềm trung gian yêu cầu. (hàm process_request của phần mềm trung gian).
Bharathwaaj

.view_namenếu bạn cần không gian tên

27

Đối với những người không gian tên các mẫu url của họ, thì bạn có thể quan tâm đến tên url không gian tên của yêu cầu. Trong trường hợp này, Django đã gọi nó view_namethay thế.

request.resolver_match.view_name

# return: <namespace>:<url name>

Cảm ơn, nhưng đây là bản dupe của câu trả lời trước đó của @ dariusz-niespodziany, phải không? stackoverflow.com/a/31931833/1450294
Michael Scheper

5
Nếu bạn không có không gian tên của mình urls.pythì @ dariusz-niespodziany là có thể sử dụng ngay lập tức reverse. Nhưng nếu bạn đang sử dụng không gian tên, thì resolver_match.url_namekhông thể trực tiếp được reverse. Vì vậy, bạn phải tự thêm không gian tên. Vì vậy, thay vì tự làm điều đó, Django đã thiết lập .view_namekhi khởi tạo.
Yeo

15

Điều này có thể đạt được thông qua:

    request.resolver_match.url_name

Django> 1,8


4

Làm rõ câu hỏi: "Theo một quan điểm, làm thế nào để bạn có được tên của một urlpattern trỏ đến nó, giả sử có chính xác một urlpattern như vậy."

Điều này có thể mong muốn vì những lý do đã nêu: từ bên trong chế độ xem, chúng tôi muốn một cách KHÔ để đưa một url đến cùng một chế độ xem (chúng tôi không muốn phải biết tên urlpattern của chính mình).

Câu trả lời ngắn gọn: Nó không thực sự đủ đơn giản để dạy lớp học của bạn, nhưng nó có thể là một điều thú vị để bạn thực hiện trong một hoặc hai giờ và đăng ký trên GitHub.

Nếu bạn thực sự muốn làm điều này, bạn sẽ phải phân lớp RegexURLResolver và sửa đổi phương thức giải quyết để trả về mẫu phù hợp (từ đó bạn có thể lấy tên mẫu) thay vì chế độ xem và cặp từ khóa / giá trị. http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142

Sau đó, bạn có thể tạo một trình trang trí hoặc có lẽ thích hợp hơn là phần mềm trung gian sử dụng lớp con này để lấy tên mẫu và lưu trữ giá trị đó ở đâu đó trong yêu cầu để các khung nhìn có thể sử dụng nó.

Nếu bạn thực sự muốn làm điều đó và bạn gặp một số rắc rối, hãy cho tôi biết và tôi có thể giúp.

Đối với lớp của bạn, tôi sẽ chỉ cho họ mã hóa tên mẫu trong dạng xem hoặc mẫu. Tôi tin rằng đây là cách làm có thể chấp nhận được.

Cập nhật: Tôi càng nghĩ về điều này, tôi càng không khuyến khích việc cố gắng lấy tên urlpattern trong một lượt xem. Các tham số urlpattern khá độc lập với các tham số của khung nhìn mà chúng trỏ tới. Nếu bạn muốn trỏ đến một url nhất định, bạn cần biết cách hoạt động của urlpattern, không chỉ cách hoạt động của chế độ xem. Nếu bạn cần biết cách hoạt động của urlpattern, bạn cũng có thể phải biết tên của urlpattern.


3

Chỉ cần cố gắng request.path. Điều đó sẽ nhận được đường dẫn hiện tại đang được yêu cầu.



1

Câu hỏi của bạn hơi không rõ ràng nhưng http://docs.djangoproject.com/en/dev/topics/http/urls/ có thể sẽ cung cấp lời giải thích cho những gì bạn đang theo đuổi.

Đặc biệt hữu ích khi lưu ý cách Django xử lý các yêu cầu:

Khi người dùng yêu cầu một trang từ trang web do Django của bạn cung cấp, đây là thuật toán mà hệ thống tuân theo để xác định mã Python nào sẽ thực thi:

  1. Django xác định mô-đun URLconf gốc để sử dụng. Thông thường, đây là giá trị của cài đặt ROOT_URLCONF, nhưng nếu đối tượng HttpRequest đến có thuộc tính gọi là urlconf (được đặt bởi xử lý yêu cầu phần mềm trung gian), giá trị của nó sẽ được sử dụng thay cho cài đặt ROOT_URLCONF.
  2. Django tải mô-đun Python đó và tìm kiếm các urlpatterns biến. Đây phải là một danh sách Python, ở định dạng được trả về bởi hàm django.conf.urls.defaults.patterns ().
  3. Django chạy qua từng mẫu URL theo thứ tự và dừng lại ở mẫu đầu tiên phù hợp với URL được yêu cầu.
  4. Khi một trong các regexes khớp, Django nhập và gọi chế độ xem đã cho, đây là một hàm Python đơn giản. Chế độ xem được chuyển một HttpRequest làm đối số đầu tiên của nó và bất kỳ giá trị nào được ghi lại trong regex làm đối số còn lại.

Nếu bạn chỉ theo đường dẫn đầy đủ, bạn có thể thử:

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path

Tôi hy vọng điều đó sẽ hữu ích - nó chỉ ra cách sử dụng mô-đun URLconf và hy vọng sẽ giúp bạn đi đúng hướng.


Cảm ơn nhưng tôi biết rằng :-) Tôi đã thêm một số giải thích để tránh hiểu lầm.
e-thoả mãn
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.