Можно ли передать параметры запроса через тег шаблона {% 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 , URL-адрес HTTP принимает форму: http: // <host>: <port> / <path>? <searchpart>.
naktinis
@naktinis URL-адрес HTTP, да. URL-адрес Django, не очень . Таким образом, для различных определений «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?
eri
3
это было бы действительно элегантно, но не работает для разбиения на страницы, так как оно также добавляет "page = 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
@geoidesic благодарит за отчет, дайте мне знать, если вы найдете в дальнейшем примечания к выпуску критического коммита / версии или сможете воспроизвести на 1.9.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
8

Во-первых, глупый ответ:

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

Серьезный ответ: нет, нельзя. Преобразователь URL-адресов Django соответствует только части пути URL-адреса, поэтому {% url %}тег может изменить только эту часть URL-адреса.

LQC
источник
На самом деле. Это тоже имеет смысл ... Я просто хотел бы, чтобы это было немного более элегантно, чем это.
Brian D
Вы всегда можете написать более элегантный настраиваемый тег - например, {% qpurl myview office = foobar%}. Это также может обработать значения и соответствующим образом их закодировать.
Spacedman 04
0

Попробуй это:

{% url 'myview' office=foobar %}

У меня это сработало. По сути, он выполняет обратную операцию по этой ссылке и применяет данные аргументы.

Эдвард Codarcea
источник