Czy możliwe jest przekazywanie parametrów zapytania przez tag szablonu {% url%} Django?

117

Chciałbym dodać parametry żądania do {% url %}tagu, na przykład ?office=foobar.

czy to możliwe? Nie mogę nic na nim znaleźć.

Brian D.
źródło
W tej odpowiedzi znajdziesz prosty niestandardowy tag szablonu do renderowania ciągów zapytań.
Christian Long

Odpowiedzi:

169

Nie, ponieważ parametry GET nie są częścią adresu URL.

Po prostu dodaj je na końcu:

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

Dla Django 1.5+

<a href="{% url 'myview' %}?office=foobar">
Daniel Roseman
źródło
10
Cóż, technicznie tak jest. Zgodnie z RFC 1738 adres URL HTTP ma postać: http: // <host>: <port> / <path>? <searchpart>.
naktinis
@naktinis Adres URL HTTP, tak. URL Django, nie tak bardzo . Tak więc dla różnych definicji „URL” obie są poprawne: P
Czy to nie powoduje, że końcowy ukośnik przerywa adres URL, na przykład example.com/myview/?office=foobarzamiast example.com/myview?office=foobar?
Al Sweigart
Tak, ale co z tego?
Daniel Roseman
34

Sposób na pomieszanie aktualnych parametrów z nowymi:

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

Zmodyfikuj ustawienia, aby uzyskać zmienną żądania:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)
eri
źródło
1
Niestety wydaje się, że to nie działa z parametrami, które są listami
Arthur
@Arthur Czy to błąd Djangos?
eri
3
byłoby to rzeczywiście eleganckie, ale nie działa w przypadku stronicowania, ponieważ dodaje również „page = 1” z poprzedniej strony z parametrów GET.
Florian
25

Użyj, urlencodejeśli argument jest zmienną

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

w przeciwnym razie znaki specjalne, takie jak spacje, mogą przerwać adres URL.

Dokumentacja: https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#urlencode

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło
Dla mnie to nie działa ... some_varzmienna zwraca pustą wartość w href, ale jest wyświetlana jako wypełniona, jeśli zostanie użyta w innym miejscu szablonu. v2.1
geoidesic
@geoidesic dzięki za raport, daj mi znać, jeśli znajdziesz dalsze informacje o zmianach dotyczących zatwierdzenia / wersji lub uda Ci się odtworzyć w 1.9.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
8

Najpierw głupia odpowiedź:

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

Poważna odpowiedź: Nie, nie możesz. Program do rozpoznawania adresów URL w Django dopasowuje tylko część ścieżki adresu URL, więc {% url %}tag może odwrócić tylko tę część adresu URL.

lqc
źródło
W rzeczy samej. To też ma sens ... Chciałbym tylko, żeby było trochę bardziej elegancko.
Brian D
Zawsze możesz napisać bardziej elegancki niestandardowy tag - na przykład {% qpurl myview office = foobar%}. Może to również przetworzyć wartości i odpowiednio je zakodować.
Spacedman
0

Spróbuj tego:

{% url 'myview' office=foobar %}

U mnie to zadziałało. Zasadniczo robi to odwrotnie na tym łączu i stosuje podane argumenty.

Edward Codarcea
źródło