본문 바로가기
DoItDJango

URL 별칭

by 자동매매 2023. 4. 13.

참조 : https://wikidocs.net/70741

 

2-05 URL 별칭

* `[완성 소스]` : [github.com/pahkey/jump2django/tree/2-05](https://github.com/pahkey/jump2django/tree/…

wikidocs.net

 

URL 별칭

 

이번 장에서는 템플릿에 사용된 URL의 하드코딩을 없애는 방법에 대해서 알아보자.

 

URL 하드코딩

 

먼저 question_list.html 템플릿에 사용된 다음 링크를 보자.

 

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

 

질문 상세를 위한 URL 링크이다. 하지만 이러한 URL 링크는 수정될 가능성이 있다. 예를 들어 http://localhost:8000/pybo/question/2 또는 http://localhost:8000/pybo/2/question 처럼 바뀔수 있다.

 

URL 링크의 구조가 자주 변경된다면 템플릿에서 사용한 모든 URL들을 일일이 찾아가며 수정해야 하는 리스크가 발생한다. 이러한 문제점을 해결하기 위해서는 해당 URL에 대한 실제 링크 대신 링크의 주소가 1:1 매핑되어 있는 별칭을 사용해야 한다.

 

URL 별칭

 

링크의 주소 대신 별칭을 사용하려면 URL 매핑에 name 속성을 부여하면 된다. pybo/urls.py 파일을 다음과 같이 수정하자.

 

[파일명: projects\mysite\pybo\urls.py]

from django.urls import path

from . import views

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

 

http://localhost:8000/pybo/ URL은 index, http://localhost:8000/pybo/2와 같은 URL에는 detail 이라는 별칭을 부여한 것이다.

 

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

 

이렇게 pybo/urls.py 파일에 별칭을 추가하면 템플릿에서 다음처럼 사용할 수 있다.

 

[파일명: C:\projects\mysite\templates\pybo\question_list.html]

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

 

하드코딩 되어 있던 /pybo/{{ question.id }} 링크를 {% url 'detail' question.id %}로 변경했다. 여기서 question.id는 URL 매핑에 정의된 <int:question_id>에 전달해야 하는 값을 의미한다.

 

파라미터명 전달

한 개의 파라미터를 전달할 경우에는 다음과 같이 사용했다.

{% url 'detail' question.id %}

 

이 때 다음처럼 파라미터 명을 함께 사용할수 있다.

{% url 'detail' question_id=question.id %}

 

만약 2개 이상의 파라미터를 사용해야 한다면 다음과 같이 공백 문자 이후에 덧 붙여주면 된다.

{% url 'detail' question_id=question.id page=2 %}

 

URL 네임스페이스

 

그런데 한가지 더 생각해 볼 문제가 있다. 현재는 pybo 앱 하나만 사용중이지만 pybo 앱 이외의 다른 앱이 프로젝트에 추가 될 수도 있을 것이다. 이런 경우 서로 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생할 것이다.

이 문제를 해결하려면 pybo/urls.py 파일에 네임스페이스를 의미하는 app_name 변수를 지정해야한다. 다음처럼 pybo/urls.py 파일에 app_name을 추가하자.

 

[파일명: projects\mysite\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 별칭에 네임스페이스를 다음과 같이 지정해야 한다.

detail 앞에 pybo 라는 네임스페이스를 붙여준 것이다.

 

[파일명: C:\projects\mysite\templates\pybo\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 %}

'DoItDJango' 카테고리의 다른 글

template 사용 - class기반 뷰어 생성  (0) 2023.04.13
데이터 저장  (0) 2023.04.13
조회와 템플릿  (0) 2023.04.13
superuser  (1) 2023.04.13
Model  (0) 2023.04.12

댓글