Чи можна передавати параметри запиту через тег шаблону {Django {% url%}?


117

Я хотів би додати параметри запиту до {% url %}тегу, наприклад ?office=foobar.

Чи можливо це? Я нічого не можу знайти на ньому.


Дивіться у цій відповіді простий тег спеціального шаблону для відображення рядків запитів.
Крістіан Лонг

Відповіді:


169

Ні, оскільки параметри GET не є частиною URL-адреси.

Просто додайте їх до кінця:

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

Для Джанго 1.5+

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

10
Ну, технічно вони є. Відповідно до RFC 1738 , HTTP-URL має форму: http: // <host>: <port> / <path>? <searchpart>.
naktinis

@naktinis HTTP URL, так. URL-адреса Джанго, не так вже й багато . Отже, для різних визначень "URL" ви обидва правильні: P

Це не призводить до того, що косою косою рисою перериває URL, як example.com/myview/?office=foobarзамість example.com/myview?office=foobar?
Al Sweigart

Так, але що?
Даніель Роузмен

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?
Ері

3
це справді було б елегантно, але не працює для пейджингу, оскільки він також додає "сторінку = 1" попередньої сторінки знову з параметрів GET.
Флоріан

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 дякую за звіт, повідомте мені, якщо ви знайдете подальше нотатки про випускні версії / версії версій або вдасться відтворити на 1.9.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

8

По-перше, дурна відповідь:

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

Серйозний захисник: Ні, не можна. Дозвіл URL-адреси Django відповідає лише частині шляху URL-адреси, тому {% url %}тег може змінювати лише ту частину URL-адреси.


Справді. І це має сенс ... Я просто хочу, щоб це було трохи елегантніше.
Брайан Д

Ви завжди можете написати більш елегантний спеціальний тег - {% qpurl myview office = foobar%}, наприклад. Це також може обробити значення та кодувати їх відповідним чином.
Спайдермен

0

Спробуйте це:

{% url 'myview' office=foobar %}

Це працювало для мене. В основному це робить зворотний зв'язок на цьому посиланні і застосовує дані аргументи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.