본문 바로가기

웹/Django

[Django] 우아한 URL / 2021.09.10

* 참고 자료 : 코드잇 Django 강의

 

1. 우아한 URL

장고에서 URL을 처리하는 방식을 우아한 URL(Elegant URL)이라고 한다.

URL을 우리가 원하는 형태로 구성할 수 있고 직관적이고 알아보기 쉬운 구조로 만들 수 있다는 장점이 있다.

 

2. 모든 메뉴에 대해 상세 페이지 만들기

만약 한 메뉴에 대해 한 가지의 url을 만들어준다면 100개의 메뉴가 있다면 100개의 url을 추가해주는 것과 같다.

이것은 너무 비효율적이다.

이럴 때 이용하는 게 경로 변수를 이용한 동적 URL (Dynamic URL) 이것이 곧 우아한 URL이다.

(1) foods앱의 url파일

* 주의 : 아래 사진에서 첫 번째 path다음에 콤마 추가해주세요!!!!!!!

 

foods앱의 url파일

 

여기서 <str:food> 부분을 동적 URL이라고 한다.

이 부분을 설명해보자면

URL: ~menu/(문자열) -> menu 다음에 경로 구분 기호( / )를 제외한 그 뒷부분을 문자열로 보고

<str:food>의 food에 담아서 food.detail함수를 호출할 때 인수로 전달한다.

 

 

 

이 <str:food> 부분을 문자열 말고 다른 타입으로도 변경할 수 있다.

 

* <int : variable>
0 또는 양의 정수와 일치하는지 확인

* <slug : variable>
문자, 숫자, 언더바, 하이픈으로 구성된 문자열인지 확인

 

 

이제 함수 food_detail을 만들어보자.

 

(2) foods앱 안의 views파일

원래는 함수의 파라미터를 request로 받았지만 이번에는 문자열을 인수로 전달한다고 했으므로

이 문자열을 받아줄 파라미터를 넣어주어야 한다.

그리고 detail.html을 render 해주면 된다.

그러기 위해서는 views에서 templates로 데이터를 넘겨주어야 하는데 저번에도 공부했듯이 

사전형에 담아서 render함수의 세 번째 인수로 넘겨주면 된다.

 

foods앱안의 views파일

 

이제 detail 템플릿을 만들면 된다.

 

(3) detail.html

간단히 문자열을 전달받으면 그 문자열을 출력하는 페이지를 만들어 보겠다.

먼저 아까 사전형으로 전달받았으니 detail.html의 코드는 다음과 같다.

 

detail.html

 

내가 만약에 URL을 ~/menu/chicken이라고 받으면 이 chicken이라는 문자열이 사전형(food변수)으로 전달되어  detail.html에 name으로 출력된다.

 

~menu/chicken 페이지

 

 

chicken 대신 pasta라고 써도

 

~menu/pasta 페이지

 

잘 나오는 것을 확인할 수 있다.