컴퓨터에서는
[ Django ] 장고의 url 매칭 - 한글 오류 (공백 오류)
컴 여행자
2025. 4. 4. 20:21
728x90
반응형
Reverse for 'hb_quiz_volume_order' with arguments '()' and keyword arguments '{u'volume': u'\uc608\ub808\ubbf8\uc57c \uc560\uac00', u'quiz_id': 0}' not found. 1 pattern(s) tried: [u'hb/quiz/volume/order/(?P<volume>\\w+)/(?P<quiz_id>\\d+)/$'] 장고에서 난 오류입니다. 무엇이 잘못된 것일까요? 아무래도 원인은 volume 값이 한글이어서 그런것 같습니다. |
네, 맞습니다. 오류 메시지와 정황을 보면 volume 값이 한글(예: "예레미야 애가")이기 때문에 Django의 URL 패턴과 매칭이 되지 않는 것이 문제입니다. 구체적으로 설명드릴게요.
🔍 오류 메시지 분석
Reverse for 'hb_quiz_volume_order' with arguments '()' and keyword arguments '{u'volume': u'\uc608\ub808\ubbf8\uc57c \uc560\uac00', u'quiz_id': 0}' not found.
1 pattern(s) tried: [u'hb/quiz/volume/order/(?P<volume>\\w+)/(?P<quiz_id>\\d+)/$']
- volume: 예레미야 애가 (한글 문자열)
- URL 패턴: hb/quiz/volume/order/(?P<volume>\w+)/(?P<quiz_id>\d+)/
- 에러 내용: 해당 패턴에 대해 reverse()를 할 수 없음
🚨 문제의 원인
정의된 URL 패턴의 정규표현식에서 (?P<volume>\w+) 부분이 문제입니다.
- \w+는 영문자, 숫자, 밑줄(_)만 매칭합니다.
- 한글, 띄어쓰기(공백), 특수문자는 \w에 포함되지 않습니다.
- 그래서 '예레미야 애가' 같은 문자열은 매칭이 안 됩니다.
✅ 해결 방법
1. 정규표현식을 수정하세요
URL 패턴을 다음과 같이 변경하세요:
# urls.py
url(r'^hb/quiz/volume/order/(?P<volume>[^/]+)/(?P<quiz_id>\d+)/$', views.hb_quiz_volume_order, name='hb_quiz_volume_order')
- [^/]+ 는 /를 제외한 어떤 문자든 포함할 수 있게 해줍니다.
- 즉, 한글, 공백, 특수문자 등도 허용됩니다.
2. URL 인코딩/디코딩도 확인하세요 (중요!)
한글을 URL에 사용할 경우 자동으로 인코딩되므로, 다음과 같이 사용할 수 있습니다.
from django.urls import reverse
from django.utils.http import urlquote # Django 1.x
# Python 3에서는 urllib.parse.quote 사용
url = reverse('hb_quiz_volume_order', kwargs={
'volume': urlquote(u'예레미야 애가'),
'quiz_id': 0
})
또는 Django 1.10 이하에서:
from django.utils.http import urlquote
💡 추가 팁
- 가능하면 URL에서 한글이나 공백 대신 slug(예: jeremiah-lamentations)를 사용하는 것이 일반적입니다.
- slugify 해서 저장하고 URL로는 slug를 쓰는 방식을 추천드립니다.
https://www.djangoproject.com/
Django
The web framework for perfectionists with deadlines.
www.djangoproject.com
728x90
반응형