알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

dajngo Template 에서 하드코딩된 URL 을 제거 본문

Web /Django

dajngo Template 에서 하드코딩된 URL 을 제거

백곳 2017. 8. 12. 11:00

Template 에서 하드코딩된 URL 을 제거


코딩을 하다보면 템플릿에 아래와 같은 코드를 사용했을때에 


<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>


/polls/ 의 url 경로가 바뀌면 /polls/ 의 경로가 들어간 템플릿을 모두 찾아 url 변경을 해줘야 합니다. 


적을때는 문제가 안되지만 프로젝트 규모가 커지고 소스 량이 많아질때는 대단히 공수가 많이 들어가는 작업 입니다. 


그래서 

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


이런식으로 바꿔 쓸수가 있습니다. 


url 'detail' 은 

polls/urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]


여기에서 url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), 에서 가지고 오게 됩니다. 


나중에 url 변경은 polls/urls.py 에서만 해주면 모두 일괄적으로 바뀌게 되니 코딩이 훨씬 편해 질수 있습니다. 


URL 의 이름공간(namespace) 나누기


추후에 app이 많이 지면 이러한 name='detail' 이 중복 되고 관리가 어려워 질수 있습니다. 


그래서 파이썬에서는 아래와 같이 사용하는것이 있습니다. 

polls/urls.py



from django.conf.urls import url

from . import views

app_name = 'polls'
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

app_name = 'polls' 을 추가 해 줍니다. 


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

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

같이 사용할수 있습니다. 



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

django HttpResponseRedirect 하기  (0) 2017.08.14
django 간단한 폼 만들기  (0) 2017.08.12
Template 시스템 사용하기  (0) 2017.08.12
django 404 에러 일으키기  (0) 2017.08.12
django view와 template 연동하기  (0) 2017.08.12
Comments