[Django] reverse함수와 URL 패턴 이름

sudog·2023년 9월 9일
0

Django

목록 보기
7/13

장고에서 URL패턴에 이름을 부여해서 사용하는 방법이 있다는 것을 알았다. 파이썬 코드에서는 어떻게 사용할까? 바로 예제를 보자.

# config/urls.py

urlpatterns = [
    path("post/", include("post.urls", namespace="post")),
]

이렇게 작성하면, 네임스페이스를 생성할 수 있다.

# post/urls.py

urlpatterns = [
	path("", views.home_view, name="home"),
    path("detail/<int:id>", views.detail_view, name="detail"),
    path("create/", views.create_view, name="create"),
    path("update/<int:id>", views.update_view, name="update"),
]

상세페이지, 생성, 업데이트 기능을 위한 URL 패턴을 설정하고 이름을 부여해 주었다. 이제 이것을 view에서 사용해 보자.

# post/views.py

def create_view(request):
    if request.method == "POST":
        post = PostModel()
        post.author = request.user
        post.title = request.POST.get("title")
        post.content = request.POST.get("content", "")
        post.save()
        return redirect(reverse("post:home"))
    else:
        return HttpResponseNotAllowed(["GET", "POST"])

위 코드는 포스트를 생성 후 홈페이지로 리다이렉트한다. 여기서 reverse함수가 사용된 것을 볼 수 있다.

reverse함수는 인자로 URL 패턴 이름을 받고 매핑된 실제 URL을 반환한다.

이렇게 구현하면 URL패턴이 변하더라도 redirect함수에 전달하는 값을 변경하지 않아도 된다. 코드와 데이터의 분리를 이루어낸 것이다.

그럼, URL로 인자를 전달하는 경우는 어떻게 처리할까? 예를 들어, update후 해당 상세페이지로 리다이렉트 할 경우, 해당 페이지의 아이디가 필요하다. 이 경우에는 아래와 같이 사용하면 된다.

def update_view(request, id):
    if request.method == "POST":
        post = get_object_or_404(PostModel, id=id)
        post.title = request.POST.get("title")
        post.content = request.POST.get("content", "")
        post.save()
        return redirect(reverse("post:detail", args=[id]))
    else:
        return HttpResponseNotAllowed(["GET", "POST"])

이렇게 reverse함수의 두번째 인자로 args=[]를 주면 된다. args안의 값 순서대로 URL 패턴에 매핑되어 실제 URL을 반환해준다.

profile
안녕하세요

0개의 댓글