[Django] URLs

송수빈·2026년 5월 2일

SSAFY

목록 보기
6/15

Django URLs

  • 요청과 응답에서 Django URLs의 역할
    • 요청 URL에 따라 실행될 view 함수가 달라진다.
  • URL dispatcher
    • URL 패턴을 정의하고 해당 패턴이 일치하는 요청을 처리할 view 함수를 연결(매핑)

Variable Routing

<path_converter:variable_name>
  • 템플릿의 많은 부분이 중복되고, URL의 일부만 변경되는 상황이라면
    urlpatterns = [
    		path('articles/1/', ...),
    		path('articles/2/', ...),
    		path('articles/3/', ...),
    		...,
    ]
  • Variable Routing이란, URL 일부에 변수를 포함시키는 것
    • 변수는 view 함수의 인자로 전달할 수 있음
      urlpatterns = [
      		path('articles/<int:num>/', ...),
      ]
    • 요청 URL의 <int:num>, <str:name>의 위치에 들어있는 값이 변수처럼 취급됨
      • 정수 num 변수가 views.detail에, 문자열 name 변수가 views.greeting에 키워드 인자로 전달됨
      • 예) 요청 URL이 /articles/10/ 이면, views.detail(request, num=10)의 형태로 호출
    • Path Converter
      • URL 변수의 타입을 지정
      • str, int 등 5가지 타입 지원
    • Path Converter의 변수명과 View 함수의 파라미터 이름은 같아야 함
  • Variable Routing 실습
    • urls.py
      urlpatterns = [
      		path('articles/<int:num>/', views.detail),
      ]
    • views.py
      def detail(request, num):
      		context = {
      				'num': num,
      		}
      		return render(request, 'articles/detail.html', context)
    • articles/detail.html
      {% extends 'articles/base.html' %}
      
      {% block content}
      	<h1>Detail</h1>
      	<h3>{{ num }}번 글 입니다.</h3>
      {% endblock content %}

App URL mapping

  • 각 앱의 urls.py에서 각자의 URL 관리

  • App URL mapping이란, 각 앱에 URL을 정의하는 것

    • 프로젝트와 각 앱이 URL을 나누어 관리를 편하게 하기 위함
    • 서로 다른 앱의 URL들이 섞이지 않도록 나누어 관리하는 방법
  • include 함수

    • include('app.urls')
      • 프로젝트 내부 앱들의 URL을 참조할 수 있도록 매핑하는 함수
      • URL의 일치하는 부분까지 잘라내고, 남은 문자열 부분은 후속 처리를 위해 include된 URL로 전달
    • 각 앱에서 urls.py를 만들고
      from django.urls import path
      from . import views
      
      urlpatterns = [
      		path('index/', views.index),
      ]
    • 프로젝트 urls.py에서 include()로 추가
      from django.urls import path, include
      
      urlpatterns = [
      		path('articles/', include('articles.urls')),
      ]

URL 이름 지정

Naming URL patterns

  • URL에 이름을 지정하는 것
    • path 함수에 name 인자를 키워드 인자로 정의해서 사용
  • URL 표기 변화
    • 해당 url을 사용했던 곳의 링크 변경
      • articles/urls.py
        from django.urls import path
        from . import views
        
        urlpatterns = [
        		path('index/', views.index, name='index'),
        ]
      • articles/index.html 변화
        # 전
        {% extends 'articles/base.html' %}
        
        {% block content}
        	<h1>Hello, {{ name }}</h1>
        	<a href="/dinner/">dinner</a>
        	<a href="/search/">search</a>
        	<a href="/throw/">throw</a>
        {% endblock content %}
        # 후
        {% extends 'articles/base.html' %}
        
        {% block content}
        	<h1>Hello, {{ name }}</h1>
        	<a href="{% url 'dinner' %}">dinner</a>
        	<a href="{% url 'search' %}">search</a>
        	<a href="{% url 'throw' %}">throw</a>
        {% endblock content %}

DTL URL tag

{% url 'url_name' arg1 arg2 %}
  • url tag
    • 주어진 URL 패턴의 이름과 일치하는 절대 경로 주소를 반환
      • URL에 이름을 붙였을 경우 url 태그와 이름을 이용해 템플릿 상에서 이름으로 실제 주소를 작성할 수 있게 해준다.
    • URL 패턴에 변수가 포함되어 있으면, ‘url_name’ 이후 추가
      • aricles/index.html
        {% extends 'articles/base.html' %}
        
        {% block content}
        	<h1>Articles</h1>
        	<a href="{% url 'detail' 1 %}">Article 1</a>
        	<a href="{% url 'detail' 2 %}">Article 2</a>
        	<a href="{% url 'detail' 3 %}">Article 3</a>
        {% endblock content %}
    • DTL의 for 태그에서 사용한 변수 이름 사용 가능
      • aricles/index.html
        {% for num in nums %}
        	<a href="{% url 'detail' num %}">Article {{ num }}</a>
        {% endfor %}

URL 이름 공간

app_name 속성

  • urls.py에 app_name 변수 설정
    • articles/urls.py
      app_name = 'articles'
      urlpatterns = [
      		path('index/', views.index, name='index'),
      ]
    • pages/urls.py
      app_name = 'pages'
      urlpatterns = [
      		path('index/', views.index, name='index'),
      ]
  • app_name이 추가 또는 수정되면 url 태그에도 해당 내용이 반영되어야 함
    {% url 'app_name:path_name' arg1 arg2 %}
profile
🌱 🐜

0개의 댓글