Django에서 선택적 URL 매개 변수 사용하기: Python, Django 및 Django Views 심화 가이드
선택적 URL 매개 변수 구문
Django에서 선택적 URL 매개 변수를 정의하려면 path()
함수와 함께 꺾쇠 안에 매개 변수 이름을 작성합니다.
from django.urls import path
urlpatterns = [
path('articles/<int:article_id>/', views.article_detail),
path('articles/<int:article_id>/comments/', views.article_comments),
]
위 예시에서:
articles/<int:article_id>/
는article_id
라는 이름의 정수형 매개 변수를 가진 URL을 정의합니다.
뷰 함수에서 선택적 매개 변수 처리
뷰 함수에서는 request.GET
또는 request.POST
딕셔너리를 사용하여 선택적 매개 변수 값에 액세스할 수 있습니다.
def article_detail(request, article_id):
try:
article = Article.objects.get(id=article_id)
except Article.DoesNotExist:
return HttpResponseNotFound("Article not found")
return render(request, 'article_detail.html', {'article': article})
def article_comments(request, article_id):
try:
article = Article.objects.get(id=article_id)
except Article.DoesNotExist:
return HttpResponseNotFound("Article not found")
comments = article.comments.all()
return render(request, 'article_comments.html', {'article': article, 'comments': comments})
article_detail
함수는article_id
매개 변수를request.GET
딕셔너리에서 가져옵니다.article_comments
함수는article_id
매개 변수를request.GET
딕셔너리에서 가져오고, 해당 기사와 관련된 댓글을 모두 가져옵니다.
기본값 설정
선택적 매개 변수에 기본값을 설정하려면 =
기호 뒤에 기본값을 지정합니다.
urlpatterns = [
path('articles/<int:article_id>/comments/', views.article_comments, kwargs={'sort_by': 'newest'}),
]
article_comments
뷰 함수는sort_by
라는 이름의 키워드 인수를 기본값으로 'newest'로 설정합니다. 뷰 함수에서 이 값을 사용하여 댓글을 정렬할 수 있습니다.
다양한 데이터 유형 지원
선택적 URL 매개 변수는 다양한 데이터 유형을 지원합니다.
- 정수:
int
- 문자열:
str
- 슬러그:
slug
- 날짜 및 시간:
datetime
,date
,time
- 패턴:
regex
Django Views에서 선택적 URL 매개 변수 활용 사례
- 특정 사용자 프로필 페이지 표시 (예:
users/<username>/
) - 특정 카테고리의 게시물 목록 표시 (예:
blog/category/<category_slug>/
) - 특정 날짜의 일기 표시 (예:
diary/<year>/<month>/<day>/
) - 검색 결과 페이지 표시 (예:
search/?q=<query_string>
)
추가 자료
- [Django 뷰에서 선택적 URL 매개
Django 뷰에서 선택적 URL 매개 변수 사용 예제 코드
프로젝트 설정
먼저 Django 프로젝트를 설정하고 myapp
라는 이름의 앱을 만듭니다.
django-admin startproject myproject
python manage.py startapp myapp
URL 설정
myapp/urls.py
파일에 다음과 같은 URL 패턴을 정의합니다.
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:article_id>/', views.article_detail),
path('articles/<int:article_id>/comments/', views.article_comments),
path('articles/<int:article_id>/comments/<int:comment_id>/', views.article_comment_detail),
]
위 코드는 다음과 같은 URL을 정의합니다.
/articles/<int:article_id>/
:article_id
라는 이름의 정수형 매개 변수를 가진 URL입니다. 이 URL은article_detail
뷰 함수를 호출합니다.
뷰 함수 정의
from django.http import HttpResponseNotFound
from .models import Article, Comment
def article_detail(request, article_id):
try:
article = Article.objects.get(id=article_id)
except Article.DoesNotExist:
return HttpResponseNotFound("Article not found")
return render(request, 'article_detail.html', {'article': article})
def article_comments(request, article_id):
try:
article = Article.objects.get(id=article_id)
except Article.DoesNotExist:
return HttpResponseNotFound("Article not found")
comments = article.comments.all()
return render(request, 'article_comments.html', {'article': article, 'comments': comments})
def article_comment_detail(request, article_id, comment_id):
try:
comment = Comment.objects.get(id=comment_id, article_id=article_id)
except Comment.DoesNotExist:
return HttpResponseNotFound("Comment not found")
return render(request, 'article_comment_detail.html', {'comment': comment})
article_detail
: 특정 기사를 표시하는 뷰 함수입니다.article_comments
: 특정 기사와 관련된 모든 댓글을 표시하는 뷰 함수입니다.
템플릿 정의
myapp/templates/myapp
디렉터리에 다음과 같은 템플릿 파일을 정의합니다.
article_detail.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>{{ article.title }}</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<a href="/articles/{{ article.id }}/comments/">댓글 보기</a>
</body>
</html>
article_comments.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>{{ article.title }} - 댓글</title>
</head>
<body>
<h1>{{ article.title }}</h1>
{% for comment in comments %}
<div class="comment">
<p>{{ comment.author }}: {{ comment.content }}</p>
</div>
{% endfor %}
Django에서 선택적 URL 매개 변수 사용: 대체 방법 및 고급 기능
converters 사용
converters
딕셔너리를 사용하여 URL 매개 변수의 처리 방식을 커스터마이징할 수 있습니다. 예를 들어, 특정 문자열 형식을 검증하거나 값을 변환하는 데 유용합니다.
from django.urls import path
from . import views
urlpatterns = [
path('articles/<slug:article_slug>/', views.article_detail),
path('articles/<int:article_id>/comments/', views.article_comments),
]
slug:article_slug
는article_slug
매개 변수가 슬러그 형식인지 검증합니다.int:article_id
는article_id
매개 변수를 정수로 변환합니다.
lookup_kwargs 사용
lookup_kwargs
인수를 사용하여 뷰 함수에 전달되는 키워드 인수를 지정할 수 있습니다.
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:article_id>/', views.article_detail, lookup_field='slug'),
]
lookup_field='slug'
는article_detail
뷰 함수에article_slug
키워드 인수를 전달합니다. 뷰 함수는 이 인수를 사용하여 특정 기사를 검색할 수 있습니다.
name 인수 사용
name
인수를 사용하여 URL 패턴에 이름을 지정하고, 다른 URL 패턴에서 참조할 수 있습니다.
from django.urls import path, reverse
from . import views
urlpatterns = [
path('articles/<int:article_id>/', views.article_detail, name='article_detail'),
path('articles/<int:article_id>/comments/', views.article_comments),
]
def article_comments(request, article_id):
# ...
url = reverse('article_detail', args=[article_id])
return redirect(url)
name='article_detail'
은articles/<int:article_id>/
URL 패턴에 'article_detail'이라는 이름을 지정합니다.reverse('article_detail', args=[article_id])
는 'article_detail' URL 패턴에 해당하는 URL을 생성합니다.redirect(url)
는 사용자를 해당 URL로 리다이렉트합니다.
다양한 HTTP 메서드 처리
path()
함수 외에도 get()
, post()
, put()
, delete()
등 다양한 HTTP 메서드를 처리하는 함수를 사용할 수 있습니다.
from django.urls import get, post
def article_create(request):
# ...
def article_update(request, article_id):
# ...
get()
함수는 GET 요청을 처리합니다.
URL 네임스페이스 사용
URL 네임스페이스를 사용하여 URL 패턴을 그룹화하고 충돌을 방지할 수 있습니다.
from django.urls import namespace
app_name = 'myapp'
urlpatterns = [
namespace(app_name, [
path('articles/<int:article_id>/', views.article_detail, name='article_detail'),
path('articles/<int:article_id>/comments/', views.article_comments, name='article_comments'),
]),
]
app_name = 'myapp'
는 앱 이름을 'myapp'으로 설정합니다.namespace(app_name, [...])
는 'myapp' 앱 네임스페이스에 속하는 URL 패턴을 그룹화합니다.
URL 리다이렉션 및 리버스 URL 생성
python django django-views