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


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">

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',
)

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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.