python/Django

[Django] 7. URL 네이밍하기

끼발자 2021. 12. 23. 15:32
반응형

 URL 하드코딩을 없애보자.

 

그 전에 URL 하드코딩이란 뭘까?

 

우리가 만든 question_list.html에서 href태그를 한번 뜯어보자.

 

<a href="/pybo/{{question.id}}/">{{ question.subject }}</a></li>

이런 형태의 URL로 구성했는데, 만약 서비스를 확장하면서 question.id 앞이나 뒤에 다른 구분자

 

예를들면 /pybo/2/question or /pybo/question/2/ 처럼 구조를 변경했다고 치자.

 

그렇게되면 템플릿에 사용된 모든 href태그들을 하나하나 수정해줘야한다. 이렇게 하드코딩된 URL을 보기 쉽게 바꿔주기 위해서

 

URL 별칭을 사용해야한다. 간단하게 생각하면 URL을 하나의 변수로 만들어 템플릿에서 사용할 수 있도록 하는과정이다.

 

pybo/urls.py 를 열어 수정하자.

 

from django.urls import path
from . import views

app_name = 'pybo' # pybo의 namespace

urlpatterns = [    
    path('',views.index, name = 'index'),
    path('<int:question_id>/', views.detail,name = 'detail'),    
]

이렇게 수정해주면, /pybo/에는 index라는 이름이, /pybo/2/ 에는 detail이라는 이름이 부여됐다.

 

만약 index라는 이름이 여러개라면?

 

pybo 말고 notion이라는 서비스를 만들고, 그 서비스에도 index라는 이름을 가진 URL이 존재할 수 있다.

 

그럴 경우를 대비하여 app_name이라는 네임스페이스를 추가하면 어떤 서비스의 이름인지 명확해진다.

 

이제 href를 수정해주자.

 

question_list.html

{% if question_list %}
    <ul>
        {% for question in question_list %}
            <li><a href="{% url 'pybo:detail' question.id %}">{{ question.subject }}</a></li>
        {% endfor %}
    </ul>
{% else %}
    <p>질문이 없습니다.</p>
{% endif %}

템플릿에서 이동하는 주소는 pybo 서비스의 detail이라는 별칭을 찾아서 이동한다.

 

반응형