Kiedy czasami czytam kod django, widzę w niektórych szablonach reverse()
. Nie jestem do końca pewien, co to jest, ale jest używane razem z HttpResponseRedirect. Jak i kiedy należy to reverse()
wykorzystać?
Byłoby miło, gdyby ktoś dał odpowiedź z kilkoma przykładami ...
url--> view name
. Ale czasami, tak jak podczas przekierowywania, musisz iść w odwrotnym kierunku i podać Django nazwę widoku, a Django generuje odpowiedni adres URL. Innymi słowyview name --> url
. To znaczyreverse()
(jest odwrotnością funkcji url). Nazwanie go może wydawać się bardziej przejrzyste,generateUrlFromViewName
ale jest to zbyt długie i prawdopodobnie niewystarczająco ogólne: docs.djangoproject.com/en/dev/topics/http/urls/…Odpowiedzi:
reverse()
| Dokumentacja DjangoZałóżmy, że
urls.py
zdefiniowałeś to w swoim:W szablonie możesz następnie odwołać się do tego adresu URL jako:
Będzie to renderowane jako:
Teraz powiedz, że chcesz zrobić coś podobnego w swoim
views.py
- np. Masz do czynienia z innym adresem URL (nie/foo/
) w innym widoku (niesome_view
) i chcesz przekierować użytkownika/foo/
(często w przypadku pomyślnego przesłania formularza).Możesz po prostu zrobić:
Ale co, jeśli chcesz zmienić adres URL w przyszłości? Będziesz musiał zaktualizować swoje
urls.py
i wszystkie odniesienia do niego w kodzie. To narusza DRY (Don't Repeat Yourself) , cały pomysł edytowania tylko jednego miejsca, do czego należy dążyć.Zamiast tego możesz powiedzieć:
Przegląda wszystkie adresy URL zdefiniowane w projekcie pod kątem adresu URL zdefiniowanego za pomocą nazwy
url_name
i zwraca rzeczywisty adres URL/foo/
.Oznacza to, że odwołujesz się do adresu URL tylko za pomocą jego
name
atrybutu - jeśli chcesz zmienić sam adres URL lub widok, którego dotyczy, możesz to zrobić, edytując tylko jedno miejsce -urls.py
.źródło
{{ url 'url_name' }}
powinien być{% url url_name %}
w Django 1.4 lub wcześniejszym. Zmieni się to w następnej wersji Django (1.5) i powinno być{% url 'url_name' %}
. Dokumenty dotyczące szablonuurl_reverse
. Najlepszym sposobem radzenia sobie z tego rodzaju dziwactwami jest odmowa ich użycia.To stare pytanie, ale jest coś, co może komuś pomóc.
Z oficjalnych dokumentów:
Na przykład. w szablonach (tag url)
Na przykład. w kodzie python (przy użyciu
reverse
funkcji)źródło
Istniejące odpowiedzi świetnie spisały się wyjaśniając, co z tą
reverse()
funkcją w Django.Miałem jednak nadzieję, że moja odpowiedź rzuci inne światło na to, dlaczego : dlaczego używać
reverse()
zamiast innych, bardziej prostych, prawdopodobnie bardziej pythonowych podejść w wiązaniu widoku szablonu, i jakie są uzasadnione powody popularności tego przekierowania za pośrednictwemreverse()
wzorzec ”w logice routingu Django.Jedną z kluczowych korzyści jest odwrotna konstrukcja adresu URL, jak wspomniali inni. Podobnie jak chcesz
{% url "profile" profile.id %}
wygenerować adres URL z pliku konfiguracyjnego adresu URL aplikacji: nppath('<int:profile.id>/profile', views.profile, name="profile")
.Ale, jak zauważył PO, użycie
reverse()
jest również często łączone z użyciemHttpResponseRedirect
. Ale dlaczego?Rozważ następujące kwestie
views.py
:A nasze minimalne
urls.py
:W
vote()
funkcji kod w naszymelse
bloku używareverse
wraz zHttpResponseRedirect
następującym wzorem:To przede wszystkim oznacza, że nie musimy kodować adresu URL na stałe (zgodnie z zasadą DRY), ale co bardziej istotne,
reverse()
zapewnia elegancki sposób konstruowania ciągów adresów URL poprzez obsługę wartości rozpakowanych z argumentów (args=(question.id)
jest obsługiwany przez URLConfig). Nałożonyquestion
ma atrybut,id
który zawiera wartość5
, adres URL skonstruowany na podstawiereverse()
będzie wtedy:W normalnym kodzie wiązania widoku szablonu używamy
HttpResponse()
lub,render()
ponieważ zazwyczaj wymagają one mniej abstrakcji: jedna funkcja widoku zwraca jeden szablon:Ale w wielu uzasadnionych przypadkach przekierowania zazwyczaj zależy nam na zbudowaniu adresu URL z listy parametrów. Obejmują one przypadki takie jak:
POST
żądaniaWiększość z nich wymaga przekierowania i adresu URL zbudowanego na podstawie zestawu parametrów. Mam nadzieję, że to dodaje do już pomocnego wątku odpowiedzi!
źródło
Ta funkcja obsługuje zasadę „sucha” - zapewniając, że nie kodujesz adresów URL w całej aplikacji. Adres URL powinien być zdefiniowany w jednym miejscu i tylko w jednym miejscu - twój adres URL. Potem tak naprawdę po prostu odwołujesz się do tych informacji.
Użyj,
reverse()
aby podać adres URL strony, podając ścieżkę do widoku lub parametr nazwa_strony z konf. Adresu URL. Używałbyś go w przypadkach, gdy nie ma sensu robić tego w szablonie{% url 'my-page' %}
.Istnieje wiele możliwych miejsc, w których możesz użyć tej funkcji. Korzystam z tego miejsca, gdy przekierowuję użytkowników w widoku (często po udanym przetworzeniu formularza) -
return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))
Możesz go również użyć podczas pisania znaczników szablonów.
Innym razem użyłem
reverse()
dziedziczenia modelu. Miałem ListView na modelu nadrzędnym, ale chciałem dostać się z jednego z tych obiektów nadrzędnych do DetailView powiązanego obiektu podrzędnego. I załączeniuget__child_url()
funkcji do rodzica, który zidentyfikowano istnienie dziecka i wrócił url To DetailView użyciureverse()
.źródło
Jest na to dokument
https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
można go użyć do wygenerowania adresu URL dla danego widoku
Główną zaletą jest to, że nie tworzysz sztywnych tras kodu.
źródło
Istniejące odpowiedzi są dość jasne. Na wszelki wypadek, gdy nie wiesz, dlaczego się nazywa
reverse
: pobiera nazwę adresu URL i podaje rzeczywisty adres URL, co jest odwrotne do posiadania adresu URL, a następnie nadania mu nazwy.źródło
Funkcja reverse () służy do przestrzegania zasady DRY django DRY, tzn. Jeśli zmienisz adres URL w przyszłości, możesz odwoływać się do tego adresu URL za pomocą reverse (urlname).
źródło