● 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들을 일일이 찾아 수정해야 하는 리스크가 발생한다.

ㄴ 이러한 문제점을 해결하기 위해서는 해당 URL에 대한 실제 링크 대신 링크의 주소가 1:1 매핑되어 있는 별칭을 사용


- URL 별칭

[파일명: projects\mysite\pybo\urls.py]
from django.urls import path
from . import views

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

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


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

[파일명: C:\projects\mysite\templates\pybo\question_list.html]
{% if question_list %} <!-- question_list가 존재하면 -->
      <ul>
         {%for question in question_list %} <!-- for 반복문 사용, :(콜론) 미사용 -->
            <li><a href="{% url 'detail' question.id %}">{{question.subject}}</a></li>
         {% endfor %} <!-- for 반복문이 끝나니 필수 작성 -->
      </ul>
{% else %} <!-- 거짓일 경우 -->
      <p> 질문이 없습니다. </p>
{% endif %} <!-- if문 종료 -->

** 하드코딩 되어 있던 /pybo/{{ question.id }} 링크를 {% url 'detail' question.id %}로 변경
** question.id는 URL 매핑에 정의된 <int:question_id>에 전달해야 하는 값을 의미
** 2개 이상의 파라미터를 사용해야 한다면 다음과 같이 공백 문자 이후에 덧 붙여주면 된다.
ㄴ 예시) {% url 'detail' question_id=question.id page=2 %}


- URL 네임스페이스

현재는 pybo 앱 하나만 사용중이지만 pybo 앱 이외의 다른 앱이 추가된다면 중복이 발생할 수 있다.
이를 해결하기 위해 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'),#name속성 부여
   path('<int:question_id>/', views.detail, name='detail'), #name 속성 부여
]

 

 

** 오류는 네임스페이스를 추가했기 때문에 발생한 오류로 해결하기 위해
템플릿에서 사용한 URL 별칭(question_list.html파일)에 네임스페이스 수정이 필요하다.


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

 

{% if question_list %} <!-- question_list가 존재하면 -->
    <ul>
        {%for question in question_list %} <!-- for 반복문 사용, :(콜론) 미사용 -->
            <li><a href="{% url 'pybo:detail' question.id %}">{{question.subject}}</a></li>
        {% endfor %} <!-- for 반복문이 끝나니 필수 작성 -->
    </ul>
{% else %} <!-- 거짓일 경우 -->
    <p> 질문이 없습니다. </p>
{% endif %} <!-- if문 종료 -->

** detail 앞에 pybo 네임스페이스 추가

 

※ redirect 함수와 URL 별칭
URL별칭은 템플릿 외에 redirect 함수에서도 사용된다. 
redirect는 특정 페이지로 이동시키는 함수이다. 

 

'Web > Django' 카테고리의 다른 글

Django - 스태틱  (0) 2024.05.18
Django - 데이터 저장  (0) 2024.05.18
Django - 조회와 템플릿  (0) 2024.05.16
Django - 장고 관리자  (0) 2024.05.16
Django - 모델  (1) 2024.05.15

+ Recent posts