본문 바로가기

[Python] django URL 별칭 만들기

액트 2022. 9. 2.
반응형

예를 들어, http://localhost:8000/pybo/2 의 URL 주소가 http://localhost:8000/2/pybo 와 같이 바뀌었다고 가정합니다.

우린 템플릿에서 사용한 모든 URL 들을 일일이 찾아가 수정해야 합니다.

이런 URL 변경에 따른 구조 변경을 유연하게 하고자 URL 별칭이라는 것이 존재합니다.

 

URL 별칭

링크의 주소 대신 별칭을 사용하려면  URL 매핑에 name 속성을 부여하면 됩니다. 

즉, URL 주소 대신에 주소 이름이 있는 것 입니다.

http://localhost/pybo 의 이름과 http://localhost/pybo/숫자 의 이름을 정의하면 됩니다.

그럼 URL 매핑이 정의되어 있는 pybo/urls.py 파일에서 urlpatterns 에 각각의 이름을 index와 detail로 정의합니다.

[기존 정의된 urls.py 파일]

from django.urls import path
from . import views

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

[수정된 urls.py 파일]

from django.urls import path
from . import views

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

 

URL 네임스페이스

다른 앱에서 사용하는 별칭과 중복되는 문제를 해결하기 위해서,

이 별칭은 pybo 앱에서 사용하는 별칭입니다 라고 정의해주는 네임스페이스(app_name)라는 변수를 지정해야 합니다.

/pybo/urls.py 파일에서 아래와 같이 추가 합니다.

from django.urls import path
from . import views

app_name = 'pybo'   ##추가

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

 

이제 부여된 이름으로 템플릿에서 사용합니다.

템플릿에서 URL 별칭 사용하기

기존 /pybo/{{ quesiton.id }}/ 부분을 {% url 'pybo:detail' question.id %} 로 변경합니다.

pybo:detail 는 pybo 앱(네임스페이스)에서 사용하는  detail 별칭을 지정하겠다를 의미합니다.

{% 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 %}

 

 

반응형

댓글