Apakah mungkin untuk melewatkan parameter kueri melalui tag cetakan {% url%} Django?

117

Saya ingin menambahkan parameter permintaan ke {% url %}tag, seperti ?office=foobar.

Apakah ini mungkin? Saya tidak dapat menemukan apa pun di dalamnya.

Brian D
sumber
Lihat jawaban ini untuk tag template kustom sederhana untuk merender string kueri.
Christian Long

Jawaban:

169

Tidak, karena parameter GET bukan bagian dari URL.

Cukup tambahkan ke bagian akhir:

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

Untuk Django 1.5+

<a href="{% url 'myview' %}?office=foobar">
Daniel Roseman
sumber
10
Ya, secara teknis memang demikian. Menurut RFC 1738 , HTTP URL berbentuk: http: // <host>: <port> / <path>? <searchpart>.
naktinis
@naktinis URL HTTP, ya. URL Django, tidak terlalu banyak . Jadi untuk berbagai definisi "URL", Anda berdua benar: P
Bukankah ini mengakibatkan garis miring menginterupsi url, seperti example.com/myview/?office=foobarbukan example.com/myview?office=foobar?
Al Sweigart
Ya tapi jadi apa?
Daniel Roseman
34

Cara untuk mencampur parameter saat ini dengan yang baru:

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

Ubah setelan Anda agar memiliki variabel permintaan:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)
eri
sumber
1
Sayangnya ini tampaknya tidak berfungsi dengan parameter yang merupakan daftar
Arthur
@Arthur Apakah ini bug Djangos?
eri
3
itu memang elegan, tapi tidak berfungsi untuk paging karena juga menambahkan "page = 1" dari halaman sebelumnya lagi dari parameter GET.
Florian
25

Gunakan urlencodejika argumennya adalah variabel

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

atau karakter khusus seperti spasi dapat merusak URL Anda.

Dokumentasi: https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#urlencode

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
Ini tidak bekerja untuk saya .. some_varvariabel kembali kosong di href tetapi terbukti terisi jika digunakan di tempat lain di template. v2.1
geoidesic
@geoidesic terima kasih atas laporannya, beri tahu saya jika Anda menemukan lebih lanjut catatan rilis commit / versi, atau berhasil mereproduksi pada 1.9.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
8

Pertama, jawaban konyol:

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

Jawaban yang serius: Tidak, Anda tidak bisa. Pemecah URL Django hanya cocok dengan bagian jalur dari URL, dengan demikian {% url %}tag hanya dapat membalikkan bagian dari URL itu.

lqc
sumber
Memang. Itu juga masuk akal ... Aku hanya berharap itu sedikit lebih elegan dari itu.
Brian D
Anda selalu dapat menulis tag kustom yang lebih elegan - misalnya {% qpurl myview office = foobar%}. Ini juga dapat memproses nilai dan mengkodekannya dengan tepat.
Spacedman
0

Coba ini:

{% url 'myview' office=foobar %}

Itu berhasil untuk saya. Ini pada dasarnya melakukan kebalikan pada tautan itu dan menerapkan argumen yang diberikan.

Edward Codarcea
sumber