내비게이션

컴포넌트가 브라우저 주소를 바꾸는 방법은 넷이다. 무엇이 다시 그려지고, 연결이 이어지는지가 다르다.

방법 주소창 새 페이지를 가져오나 연결 기록
await self.wire.redirect_to(to) 목적지 가져온다. 목적지의 컴포넌트가 새로 마운트된다 이 컴포넌트는 더 렌더하지 않는다(freeze) 새 항목
await self.wire.push_to(to) 목적지 가져와 <body>를 바꾼다 같은 live_session 안이면 이어지고 params_changed()가 돈다. 경계를 넘으면 전체 로드 새 항목
await self.wire.replace_to(to) 목적지 가져오지 않는다 이어진다. params_changed()가 돈다 지금 항목을 바꾼다
self.wire.params["k"] = v 쿼리만 가져오지 않는다 이어진다. params_changed()는 돌지 않는다 지금 항목을 바꾼다
  • redirect_to는 페이지 이동이다. BOOST_PAGES가 켜져 있으면 전체 로드 없이, 꺼져 있으면 보통의 로드로 간다. 부른 뒤에는 이 컴포넌트가 렌더를 보내지 않는다. 인가가 실패했을 때 로그인 페이지로 보내는 용도가 이것이다(lifecycle-hooks).
  • push_to는 같은 페이지의 다른 상태로 가는 이동이다. 목록의 다음 쪽, 탭 전환. 뒤로 가기가 이전 상태로 돌아온다. BOOST_PAGES와 상관없이 가져와 바꾼다.
  • replace_to는 주소만 고친다. 필터를 바꿨지만 뒤로 가기에 남기고 싶지 않을 때.
  • self.wire.params에 쓰면 이벤트가 끝난 뒤 쿼리 문자열이 그 값으로 바뀐다(replaceState). params는 페이지의 모든 컴포넌트가 함께 쓰는 dict다 — 한 컴포넌트가 쓴 키를 다른 컴포넌트도 본다. .json으로 끝나는 키는 값을 JSON으로 적고 읽는다(self.wire.params["expanded.json"] = [1, 2]).

to#

django.shortcuts.redirect()와 같다. URL 경로("/items/"), 쿼리나 조각만("?page=2", "#top" — 지금 경로에 붙는다), URL 이름과 그 인자, get_absolute_url()이 있는 모델 인스턴스.

await self.wire.push_to("?page=2")
await self.wire.redirect_to("items:detail", pk=item.pk)   # reverse("items:detail", kwargs={"pk": ...})
await self.wire.redirect_to(item)                          # item.get_absolute_url()

키워드 인자는 모두 URL 역참조로 간다. 이후 릴리스가 이 메서드들에 옵션을 더하면 키워드 전용 이름으로 더한다. URL 패턴의 인자 이름이 그 옵션과 겹치면 reverse()의 결과를 넘긴다: redirect_to(reverse("x", kwargs={...})).

클라이언트에서#

wireview.visit(url, {replace})는 링크를 누른 것과 같다(boost). JS().navigate(url, replace=)는 같은 이동을 {% on %} 한 줄로 건다.

테스트#

view.assert_pushed_to()·assert_replaced_to()·assert_redirected_to()로 단언하고, follow_push()· follow_redirect()로 클라이언트가 할 일을 이어서 한다(testing).