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.


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

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',
)

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


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.