[Django] Django URL

문지은·2023년 4월 10일
0

Django 기초

목록 보기
2/14
post-thumbnail

Django 코드를 작성할 때는 URL -> Veiw -> Template 순서로 작성한다.
이번 글에서는 Django URL을 작성 하는 방법에 대해 알아보겠다.


Variable routing

  • URL 주소를 변수로 사용하는 것을 의미한다.
  • URL의 일부를 변수로 지정하여 view 함수의 인자로 넘길 수 있다.
  • 즉, 변수 값에 따라 하나의 path()에 여러 페이지를 연결 시킬 수 있다.

Variable routing 작성하기

  • Django는 URL 끝에 / 를 붙여주는 것이 기본 설정이다.
  • 변수는 <>에 정의하며 view 함수의 인자로 할당됨
  • 기본 타입은 string이며 5가지 타입으로 명시할 수 있음
    • str : / 를 제외하고 비어있지 않은 모든 문자열, 작성하지 않을 경우 기본 값
    • int : 0 또는 양의 정수와 매치
# urls.py

urlpatterns = [
		...,
		# path('hello/<str:name>/', views.hello),
		path('hello/<name>/', views.hello),
]

View 함수 작성하기

  • variable routing으로 할당된 변수를 인자로 받고 템플릿 변수로 사용한다.
# article/views.py

def hello(request, name):
		context = {
				'name' = name,
		}
		return render(request, 'hello.html', context)
<!-- templates/articles/hello.html -->

{% extends 'base.hmtl' %}

{% block content %}
		<h1> 만나서 반가워요 {{name}}</h1>
{% endblock %}

App URL mapping

앱이 많아지면 하나의 url 파일에서 주소를 관리하는 것이 어려워 지므로, 각 앱에서 urls.py파일을 생성한 후 매핑한다.

Including other URLconfs

  • urlpattern은 언제든지 다른 URLconf 모듈을 포함(include)할 수 있다.
  • include되는 앱의 url.py에 urlpatterns가 작성되어 있지 않다면 에러가 발생한다.
# project/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
		path('admin/', admin.site.urls),
		path('[app path]/', include('[appname].urls'))
]

include()

  • 다른 URLconf(app/urls.py)들을 참조할 수 있도록 돕는 함수
  • 함수 include()를 만나게 되면 URL의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include 된 URLconf로 전달

Naming URL patterns

  • 만약 ‘index/’의 문자열 주소를 ‘new-index’로 바꿔야 한다고 가정해보자
    • 그렇다면 ‘index/’ 주소를 사용했던 모든 곳을 찾아서 변경해야 하는 번거로움이 발생한다.
    • 링크에 URL을 직접 작성하는 것이 아니라 path() 함수의 name 인자를 정의해서 사용할 수 있다
  • Django는 URL에 이름을 지정하는 방법을 제공함으로써 view 함수와 템플릿에서 특정 주소를 쉽게 참조할 수 있도록 도와준다.
# app/urls.py

app_name = '[app_name]'

urlpatterns = [
		path('[function path]/', views.[function], name = '[function]'),
]

URL tag

  • {% url ‘ ‘%}
  • 주어진 URL 패턴 이름 및 선택적 매개 변수와 일치하는 절대 경로 주소를 반환
  • 템플릿에 URL을 하드 코딩하지 않고도 DRY 원칙을 위반하지 않으면서 링크를 출력하는 방법이다.

URL namespace

  • URL namespace를 사용하면 서로 다른 앱에서 동일한 URL 이름을 사용하는 경우에도 이름이 지정된 URL을 고유하게 사용할 수 있다.
  • app_name attribute를 작성해 URL namespace를 설정한다.
# articles/urls.py

app_name = 'article'
urlpatterns = [
			...,
]
# pages/urls.py

app_name = 'pages'
urlpatterns = [
			...,
]

URL tag 수정

  • app_name을 지정한 이후에는 url 태그에서 반드시 app_name : url_name 형태로만 사용해야 한다.
  • 그렇지 않으면 NoReverceMatch 에러가 발생한다.
profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글