개인 프로젝트/Django-mysite

#8 URL과 네임스페이스

Scala0114 2021. 9. 21. 13:42

1. URL 하드코딩

 question_list.html 파일을 살펴보면 템플릿 코드에서 url을 직접 만들어서 넣어주었다.  이러한 방식은 url에 수정사항이 발생할 때 마다 모든 url 코드를 찾아 수정해야하는 불편이 발생한다.  이를 해결하기 위해 url의 별칭을 사용한다.

 

먼저 pybo/urls.py 를 다음과 같이 수정한다.

각 url 매핑에 name 속성을 부여한 것을 볼 수 있다. 이제 이 url 매핑은 하드코딩할 필요 없이 별칭만으로 사용할 수 있다.  이제 템플릿에서 하드코딩한 url을 별칭으로 대체할 차례이다.

 

templates/pybo/question_list.html 을 다음과 같이 수정한다.

"/pybo/{{ question.id }}" 로 하드코딩 되어있던 url 링크가 "{% url 'detail' question.id %}" 로 변경된 것을 볼 수 있다.

이제 detail 에 해당하는 url이 수정되더라도 템플릿은 수정할 필요가 없어졌다.

 

 

2. URL 네임 스페이스

 그런데 만약 pybo 이외의 앱을 추가했을 때, 그 앱에서도 같은 별칭의 url을 사용한다면 위의 방식으로는 중복이

발생하는 문제가 생긴다.  이를 해결하기 위해서 각 앱의 url 매핑마다 네임 스페이스를 지정해야한다. 

 

pybo/urls.py 를 다음과 같이 수정한다.

app_name = 'pybo' 를 추가하여 현재 앱의 url 매핑을에 'pybo' 라는 이름을 붙였다.  이제 템플릿 파일에서 별칭을 사용한 코드도 수정해줘야 한다.

 

url 링크가 "{% url 'detail' question.id %}" 에서 "{% url 'pybo:detail' question.id %}" 로 변경된 것을 확인할 수 있다.

url 네임스페이스 : url 별칭 의 형태로 사용하는 것으로 다른 앱끼리의 별칭의 중복을 피하는 것이다.