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

URL 하드코딩

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

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

<a>태그의 href는 하이퍼링크를 의미한다.

링크가 /pybo/{{ question.id }}/ 로 주소가 완전히 다 적혀 있는 것을 하드코딩이라한다.

링크 구조가 수정될 때 일일이 찾아 수정하는 수고를 덜기 위하여 하드코딩은 지양하는게 좋다.

URL 별칭

링크주소 대신 URL 매핑에 name 속성을 부여해 별칭을 사용할 수 있다.

[파일명: C:\projects\yoursite\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'),
]

URL 별칭 사용

[파일명: C:\projects\yoursite\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 네임스페이스

현재는 pybo앱 하나만 사용중이지만, 이후 다른 앱들이 추가되면서 동일한 URL 별칭을 사용해 중복되는 상황을 방지함.

pybo/urls.py 에서 네임스페이스를 정의하자

[파일명: C:\projects\yoursite\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'),
]

네임스페이스를 사용해보자

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

네임스페이스 : 별칭 을 사용하자!

+ Recent posts