Có thể chuyển các tham số truy vấn qua thẻ mẫu {% url%} của Django không?


117

Tôi muốn thêm các thông số yêu cầu vào {% url %}thẻ, chẳng hạn như ?office=foobar.

Điều này có khả thi không? Tôi không thể tìm thấy bất cứ điều gì trên đó.


Xem câu trả lời này để biết thẻ mẫu tùy chỉnh đơn giản để hiển thị các chuỗi truy vấn.
Christian Long

Câu trả lời:


169

Không, bởi vì các tham số GET không phải là một phần của URL.

Chỉ cần thêm chúng vào cuối:

<a href="{% url myview %}?office=foobar">

Đối với Django 1.5+

<a href="{% url 'myview' %}?office=foobar">

10
Về mặt kỹ thuật, chúng là như vậy. Theo RFC 1738 , một URL HTTP có dạng: http: // <host>: <port> / <path>? <searchpart>.
naktinis

@naktinis Một URL HTTP, vâng. Một URL Django, không quá nhiều . Vì vậy, cho các định nghĩa khác nhau của "URL", bạn đều đúng: P

Điều này không dẫn đến việc dấu gạch chéo ở cuối làm gián đoạn url, như example.com/myview/?office=foobarthay vì example.com/myview?office=foobar?
Al Sweigart

Có nhưng vậy thì sao?
Daniel Roseman

34

Một cách để trộn các thông số hiện tại với một thông số mới:

{% url 'order_list' %}?office=foobar&{{ request.GET.urlencode }}

Sửa đổi cài đặt của bạn để có biến yêu cầu:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

1
Thật không may, điều này dường như không hoạt động với các tham số là danh sách
Arthur

@Arthur Có phải lỗi Djangos không?
eri

3
điều đó thực sự rất thanh lịch, nhưng không hoạt động cho phân trang vì nó cũng thêm lại "page = 1" của trang trước từ các tham số GET.
Florian

25

Sử dụng urlencodenếu đối số là một biến

<a href="{% url 'myview' %}?office={{ some_var | urlencode }}">

hoặc các ký tự đặc biệt khác như dấu cách có thể phá vỡ URL của bạn.

Tài liệu: https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#urlencode


Điều này không hiệu quả với tôi .. some_varbiến trả về trống trong href nhưng được hiển thị sẽ được lấp đầy nếu được sử dụng ở nơi khác trong mẫu. v2.1
geoidesic

@geoidesic cảm ơn bạn đã báo cáo, hãy cho tôi biết nếu bạn tìm thấy thêm ghi chú phát hành cam kết / phiên bản vi phạm hoặc quản lý để tái tạo vào 1.9.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

8

Đầu tiên, một câu trả lời ngớ ngẩn:

{% url my-view-name %}?office=foobar

Một nhà cảm xạ nghiêm túc: Không, bạn không thể. Trình phân giải URL của Django chỉ khớp với phần đường dẫn của URL, do đó {% url %}thẻ chỉ có thể đảo ngược phần đó của URL.


Thật. Điều đó cũng có lý ... Tôi chỉ ước nó thanh lịch hơn thế một chút.
Brian D

Bạn luôn có thể viết một thẻ tùy chỉnh thanh lịch hơn - ví dụ: {% qpurl myview office = foobar%}. Điều này cũng có thể xử lý các giá trị và mã hóa chúng một cách thích hợp.
Spacedman

0

Thử cái này:

{% url 'myview' office=foobar %}

Nó đã làm việc cho tôi. Về cơ bản, nó làm ngược lại liên kết đó và áp dụng các đối số đã cho.

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.