본문 바로가기
프로그래밍 언어/Django

[Django] Django urls 사용하기 (mapping과 routing)

by mine* 2023. 4. 8.

이번 글에서는 장고에서 사용하는 url에 대해서 알아보자

 

URL mapping

프로젝트를 진행하다보면 앱과 화면을 표시하는 html파일들이 점점 많아지면서 경로가 길어지고 복잡해진다.

이때 모든 경로가 하나의 urls.py에만 있다면 가독성이 떨어지고 관리가 힘들어진다.

따라서 이를 해결하기 위해 include를 사용하여 각각의 앱이 각자의 url을 따로 관리하게 한다.

 

어떤 방식으로 사용할까?

우선 기본으로 사용하는 urls.py로 이동하자

그리고 include를 import하고 작성되어 있던 경로를 앱마다 하나의 경로로 매핑한다.

# urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/', include('articles.urls') ),
    # articles 경로로 시작되는 요청은 articles 안에 있는 urls파일에서 처리한다는 의미이다.
]

urls파일로 처리하겠다고 했지만 앱에는 urls.py 파일이 존재하지 않는다.

따라서 앱에 urls.py 파일을 생성한다. 그리고 아까 매핑하면서 삭제한 경로들을 새로 설정한다.

원래 urls.py의 경로는 다음과 같았다.

# urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/', views.index),
    path('articles/introduce/', views.introduce),
    path('articles/dinner/', views.dinner, name='dinner'),
]

이것을 새로 생성한 앱의 urls.py에 작성해주었다.

# articles/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('introduce/', views.introduce, name='introduce'),
    path('dinner/', views.dinner, name='dinner'),
]

articles의 urls는 기본 경로가 articles/로 설정되어 있으므로 그 이후의 경로만 작성해주면 된다.

이렇게 URL의 매핑을 통해 관리를 더욱 쉽게 할 수 있다.

 

Variable routing

이번에는 URL주소를 변수로 사용하는  Variable routing에 대해 알아보자

일반적으로 하나의 템플릿은 하나의 주소를 가진다. 따라서 중복이 많은 템플릿을 모두 새로 지정한다면 너무 복잡해지고 비효율적이다. 그래서 우리는 URL의 일부를 변수로 지정하여 하나의 path에 여러 페이지를 연결할 것이다.

이러한 Variable routing는 5가지 타입이 존재하는데 이번에는 str과 int만 알아볼 것이다.

먼저 urls.py에 Variable routing을 위한 <name>을 작성한다.

# urls.py

urlpatterns = [
		...,
    path('hello/<name>/', views.hello),
    	  # <str:name>

Variable routing은 "<변수>"의 형태로 쓰이며 기본값은 str이다. 따라서 int형태로 사용하기 위해서는 <int:변수>로 작성한다. 그리고 view함수와 html파일을 작성한다.

# articles/views.py

def hello(request,name):
    context={'name':name,}
    return render(request,'articles/hello.html',context)
# articles/templates/articles/hello.html

{% extends "base.html" %}

{% block content %}
	<h1>안녕 {{ name }} 반가워</h1>
{% endblock content %}

이제 서버를 실행시켜보자 Variable routing에 넣은 변수가 전달되어 출력된 것을 확인할 수 있다.

이렇게 url에 다른 변수를 설정함으로서 하나의 path로 여러개의 페이지를 생성할 수 있다.

 

URL Name

마지막으로 url의 name에 대해 알아보자

위의 url의 path에 name이 설정된 것이 보일 것이다. 이런 name은 왜 설정하는 것일까?

만약 주소를 바꿔야 하는일이 생긴다면?? 주소와 연결되어 있는 모든 경로를 변경해야 한다. 그런데 이건 너무 번거롭지 않은가?

따라서 이러한 변경을 쉽게 하기 위해서 실제 링크대신 설정한 name을 템플릿에서 사용한다.

그렇기 때문에 name은 중복해서 사용할 수 없다.

 

그런데 다른 앱에서 동일한 name을 사용하는 경우가 있을 수 있다. 이런 경우 name의 중복으로 인해 원하는 경로로 이동하지 않을 수 있다. 그래서 앱마다 namespace를 사용하여 동일한 name을 사용하더라도 url을 고유하게 사용할 수 있다.

from django.urls import path
from . import views

app_name = 'articles'

urlpatterns = [
    path('', views.index, name='index'),
    path('introduce/', views.introduce, name='introduce'),
    path('dinner/', views.dinner, name='dinner'),
]

그런데 app_name 사용시 주의해야할 것이 있다.

우리는 일반적으로 url로 경로를 불러올 때 name이 없다면 {% url ‘/(불러올 페이지 이름)/‘ %} (절대경로)의 형태로 사용하고 name이 있다면 {% url '설정한 name' %}의 형태로 사용한다.

그런데 app_name이 설정된 상태라면?

반드시 {% url app_name:url_name %}의 형태로 사용해야 한다.

그렇지 않으면 NoReverceMatch 에러가 발생한다.

# name 미설정시
{% url 'articles/index/' %}

# name 설정시
{% url 'index' %}

# app_name 설정시
{% url 'articles:index' %}

 

'프로그래밍 언어 > Django' 카테고리의 다른 글

[Django] Django template, 장고 템플릿  (0) 2023.04.04
[Django] Django 시작하기  (0) 2023.04.02

댓글