현재 인턴중인 회사에서 기존에 쓰인 소스코드의 url, view, template을 모두를 수정해야 하는 일이 생겼다. 이들의 관계성에 대한 이해가 부족해서 알고보면 간단한 작업이었던것을 하루종일 걸려서 수정했다.. 이 때 배운 내용을 정리해 보려고 한다.
url 호출 -> url에 지정된 API를 호출 -> API의 return 값인 html 표시
이곳에서 각 API의 url을 지정하여 호출할 수 있다는 점만 알고 있었으나 각각의 parameter가 어떤 역할을 하는지에 대한 이해가 부족했다.
다음의 urlpatterns을 살펴보자.
urlpatterns = [
path('login/', LogInView.as_view(), name='login'), [1]
url('db/(?P<country_id>[a-zA-Z0-9_]+)/add/$', views.city_add, name='city_add'), [2]
url('db/([a-zA-Z0-9_]+)/detail/$',views.place_detail, name='place_detail'), [3]
path 와 url은 각각의 parameter를 가진다.
path(route, view, kwargs=None, name=None)
url(regex, view, kwargs=None, name=None)
다른 점은 첫번째 parameter인데, 기존의 url이 regex를 지정해야 했다면, path는 route를 지정해 주면 된다.
따라서, 위의 예시 [2]는 path(db/<int:country_id>/add/
와 동일하다.
단순한 루트나 view에서 받은 값을 사용하여 지정하는 경우에는 path
를 사용하면 된다. 위의 예시 [3]의 경우, 루트의 일부를 html에서 받았기 때문에, url
을 사용하여 regex를 지정해 주었다. (사실 더 좋은 방법이 있을것 같다..)
두번째 parameter는 API를 지정해준다.
새번째 parameter에는 view에서 사용할 urlpattern의 이름을 지정해 준다. 뒤에 설명한 redirect의 첫번째 인자로 여기서 지정한 이름을 넘겨주면, 해당 url이 호출되어, API가 호출된다.
장고의 뷰에서 일련의 처리가 끝난후 return값으로 render와 redirect를 지정할 수 있다.
Combines a given template with a given context dictionary and returns an HttpResponse object with that rendered text.
render(request, template_name, context=None, content_type=None, status=None, using=None)
{{ key }}
로 access 가능 render
와 달리 template을 지정할 수 없으므로, 단순히 다른 API를 호출 할 때만 사용할 수 있다. 따라서, context와 같이 dictionary를 넘기는 것은 불가능하다.
redirect(to, *args, permanent=False, **kwargs)
참고링크:
https://ssungkang.tistory.com/entry/Django-render-%EC%99%80-redirect-%EC%9D%98-%EC%B0%A8%EC%9D%B4