당신은 멋쟁이, 우리는 장고쟁이~

0%

Writing your first Django app, part3 - 7편

URL 이름공간 분리하기


이번 튜토리얼은, polls 앱 하나 밖에 없습니다.

하지만, 실제 Django 프로젝트에서는, 프로젝트에서 사용되는 앱의 갯수가, 5개, 10개, 20개 혹은 그 이상이 될수 있습니다.


그렇다면, Django 는 URL 이름들을 어떻게 구분해야 할까요?



예를들어,

polls 앱은 detail view 를 가지고 있습니다.

하지만, polls 앱 외에 다른 앱인 blog 앱이 존재한다고 가정할때,

그 앱도 detail view 를 가지고 있을수 있습니다.



1
그렇다면, {% url %} 태그안에서 어떻게 이 두가지의 detail view 를 구분할까요?

URLConf 에 이름공간 추가하기


정답은, URLConf 에 이름공간들을 추가해 주는것입니다.


polls/urls.py 파일로 가서, app_name 을 추가해 줍니다.


1
2
3
4
5
6
7
8
9
10
11
from django.urls import path

from . import views

app_name = 'polls' # Namespace 를 추가해줍니다
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
path('<int:question_id>/results/', views.results, name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]


URLConf 에 추가된 Namesapce 사용


polls/index.html 템플릿은 아래와 같이 작성되어 있습니다. (지난 포스팅)


1
2
3
4
5
6
7
8
9
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}

바뀐 namespace 를 적용하고, a 태그가 정확하게 polls 에 있는 detail 뷰를 가르키게 하려면,

아래와 같이 a 태그를 수정해 줍니다.


1
2
<li><a href="{% url 'polls:detail' question.id %}">
{{ question.question_text }}</a></li>


1
2
{% url %} 태그안에, 
'polls:detail' 이라고 써주어서, polls 에 있는 detail path 라는것을 지정해 줍니다.


마치며..



polls 앱 말고, 다른 앱이 존재 한다면, namespace 를 분리하기 위해서, 아래 절차를 따르면 됩니다.


  1. 해당 엡의 urls.py 에 app_name 을 지정

  2. 템플릿에서

    1
    2
    3
    {% url %}  태그안에 '앱이름:url명' 으로 url  연결

    e.g. {% url 'polls:detail' question.id %}

뷰를 작성하는것이 편해졌다면, 이제 튜토리얼의 part 4 로 넘어갑니다.


part4 는, form 프로세싱과 generic 뷰에 대한 기본을 다룹니다.