เป็นไปได้ไหมที่จะส่งพารามิเตอร์การค้นหาผ่านแท็กเทมเพลต {% url%} ของ Django


117

ฉันต้องการที่จะเพิ่มพารามิเตอร์ร้องขอไปยังแท็กเช่น{% url %}?office=foobar

เป็นไปได้หรือไม่ ฉันไม่พบอะไรเลย


ดูคำตอบนี้สำหรับแท็กเทมเพลตที่กำหนดเองอย่างง่ายเพื่อแสดงสตริงข้อความค้นหา
Christian Long

คำตอบ:


169

ไม่เนื่องจากพารามิเตอร์ GET ไม่ได้เป็นส่วนหนึ่งของ URL

เพียงเพิ่มลงในตอนท้าย:

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

สำหรับ Django 1.5+

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

10
ในทางเทคนิคพวกเขา ตามRFC 1738 HTTP URL อยู่ในรูปแบบ: http: // <host>: <port> / <path>? <searchpart>
naktinis

@naktinis URL HTTP ใช่ Django URL, ไม่มาก ดังนั้นสำหรับคำจำกัดความต่างๆของ "URL" คุณถูกต้องทั้งคู่: P

สิ่งนี้ไม่ส่งผลให้เครื่องหมายทับต่อท้ายขัดจังหวะ url เช่นexample.com/myview/?office=foobarแทนที่จะเป็นexample.com/myview?office=foobar?
Al Sweigart

ใช่ แต่เป็นอย่างไร
Daniel Roseman

34

วิธีการผสมพารามิเตอร์ปัจจุบันกับพารามิเตอร์ใหม่:

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

แก้ไขการตั้งค่าของคุณให้มีตัวแปรคำขอ:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

1
น่าเสียดายที่ดูเหมือนจะใช้ไม่ได้กับพารามิเตอร์ที่เป็นรายการ
Arthur

@ อาเธอร์มันเป็นบั๊ก Djangos หรือเปล่า?
eri

3
ซึ่งจะสวยงามแน่นอน แต่ใช้ไม่ได้กับการเพจเนื่องจากยังเพิ่ม "page = 1" ของเพจก่อนหน้าอีกครั้งจากพารามิเตอร์ GET
Florian

25

ใช้urlencodeถ้าอาร์กิวเมนต์เป็นตัวแปร

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

มิฉะนั้นอักขระพิเศษเช่นการเว้นวรรคอาจทำให้ URL ของคุณเสียหาย

เอกสารประกอบ: https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#urlencode


สิ่งนี้ไม่ได้ผลสำหรับฉัน .. some_varตัวแปรจะส่งคืนค่าว่างใน href แต่จะแสดงให้กรอกหากใช้ที่อื่นในเทมเพลต v2.1
geoidesic

@geoidesic ขอบคุณสำหรับรายงานโปรดแจ้งให้เราทราบหากคุณพบบันทึกย่อประจำรุ่นของข้อตกลง / เวอร์ชันเพิ่มเติมหรือจัดการเพื่อทำซ้ำใน 1.9
Ciro Santilli 郝海东冠状病六四事件法轮功

8

ก่อนอื่นคำตอบโง่ ๆ :

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

anwser ร้ายแรง: ไม่คุณทำไม่ได้ ตัวแก้ไข URL ของ Django จะจับคู่เฉพาะส่วนเส้นทางของ URL ดังนั้น{% url %}แท็กจึงสามารถย้อนกลับได้เฉพาะส่วนนั้นของ URL เท่านั้น


จริง มันก็สมเหตุสมผลเช่นกัน ... ฉันแค่หวังว่ามันจะสง่างามกว่านั้นเล็กน้อย
Brian D

คุณสามารถเขียนแท็กแบบกำหนดเองที่หรูหรากว่าได้เสมอเช่น {% qpurl myview office = foobar%} นอกจากนี้ยังสามารถประมวลผลค่าและเข้ารหัสได้อย่างเหมาะสม
Spacedman

0

ลองสิ่งนี้:

{% url 'myview' office=foobar %}

มันได้ผลสำหรับฉัน โดยพื้นฐานแล้วจะทำการย้อนกลับของลิงก์นั้นและใช้อาร์กิวเมนต์ที่กำหนด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.