Можно ли передать параметры запроса через тег шаблона {% 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-адреса.


На самом деле. Это тоже имеет смысл ... Я просто хотел бы, чтобы это было немного более элегантно, чем это.
Brian D

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

0

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

{% url 'myview' office=foobar %}

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.