초보 개발자

django {% url %} 본문

AI 웹개발 트랙 - 내배캠/6주차

django {% url %}

taehyeki 2022. 1. 21. 17:50

이 글은 전부 점프 투 장고의 내용을 바탕으로 작성되어졌습니다.

 

2-05 URL과 네임스페이스 - 점프 투 장고 (wikidocs.net)

 

2-05 URL과 네임스페이스

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

wikidocs.net

 

 

URL의 주소가 바뀐다면 ? 

<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 별칭

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


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 파일을 변경하면 템플릿에서 다음처럼 사용할 수 있다.

{% 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 앱 하나만 사용중이지만 pybo 앱 이외의 다른 앱이 프로젝트에 추가 될 수도 있을 것이다. 이런 경우 서로 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생할 것이다.

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

다음처럼 pybo/urls.py 파일에 app_name을 추가하자.

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'),
]

 

 

{% 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 %}

{% url 'detail' question.id %}을 {% url 'pybo:detail' question.id %}으로 바꾸어 주었다. detail 앞에 pybo 라는 네임스페이스를 붙여준 것이다.

URL별칭은 템플릿 외에 redirect 함수에서도 사용된다. 아래 redirect 함수의 사용은 좀 더 나중에 공부한다. 지금은 눈으로만 살펴보자.

예) redirect('pybo:detail', question_id=question.id)

 

 

정리하자면

 

사용 이유

전에는 href = '/sign-up'과 같이 일일이 다 적어주었지만 , 만약 회원가입 하는 url이 /user/sign-up과 같이 바뀐다면,

일일이 html에서 수정해주어야 하는 문제가 발생한다. 이런 이유로 url을 사용한다.

 

사용 방법

{% url 'user:sigin-up' %} 과 같은 구조를 분석해보자, user는 user.urls에서 app_name = user라고 설정해 둔 것이다.

설정해 준 이유는 여러 앱이 있을 경우 중복되는 name이 있다면 충돌이 일어나기 때문이다.

sign-up은 앞서 우리가 설정해둔 name이다. 따라서 저렇게 적어두면 우리가 urls에 적어둔 url대로 넘어갈 것이다.

{% url 'tweet:tweet_detail' tw.id  %} 이렇게 뒤에 tw.id가 붙은 경우에는 우리가 지정해둔 url이

tweet/<int:id> 인 경우 저 id로 들어가는 것라고 생각하자. 만약 tweet/<int:id>/<int:id2>와 같이 2개 이상이면 어떻게 되는지는 아직 모르겠다.

 

 

 

'AI 웹개발 트랙 - 내배캠 > 6주차' 카테고리의 다른 글

6주차 WIL  (0) 2022.01.22
django views class  (0) 2022.01.21
AWS EC2 배포 및 가비아 연결  (0) 2022.01.21
many-to-many  (0) 2022.01.21
django sparta 강의 정리 및 의문점  (0) 2022.01.19