기술블로그-Django편
✅ Django CBV에서 URL 파라미터 이름 정리 (어떤 파라미터 이름을 쓰느냐에 따라 오류가 발생)
Chansman
2025. 5. 12. 00:16
✅ Django CBV에서 URL 파라미터 이름 정리
Django에서 Class-Based View(CBV)를 사용할 때, URLConf에 어떤 파라미터 이름을 쓰느냐에 따라 오류가 발생할 수 있습니다. 특히 ListView, UpdateView, DeleteView, DetailView 간에는 기대하는 URL 파라미터 명칭이 다르기 때문에 정확하게 맞춰주는 것이 중요합니다.
✅ 구조 예시
# blog/urls.py
path('<int:blog_pk>/', BlogDetailView.as_view(), name='detail') # ✅ ListView 기반
path('<int:pk>/update/', BlogUpdateView.as_view(), name='update') # ✅ UpdateView 기반
🔍 왜 ListView는 blog_pk로 되고 UpdateView는 안 되는가?
✅ ListView (또는 커스텀 View)
class BlogDetailView(ListView):
def get(self, request, *args, **kwargs):
blog_pk = kwargs.get('blog_pk') # ✅ 내가 직접 처리
self.object = get_object_or_404(Blog, pk=blog_pk)
- ListView는 URL 파라미터 이름이 무엇이든 상관없음
- 우리가 kwargs['blog_pk']로 직접 지정하면 끝
- 따라서 URL에서 blog_pk, slug, id 등 자유롭게 사용 가능
❌ UpdateView / DeleteView / DetailView
class BlogUpdateView(UpdateView):
model = Blog
- 내부적으로 self.get_object() 호출 시 무조건 self.kwargs['pk']를 기대함
- URLConf에 <int:blog_pk>/update/처럼 써버리면 KeyError, NoReverseMatch, Http404 등 오류 발생
✅ 따라서 URLConf는 반드시 이렇게:
path('<int:pk>/update/', BlogUpdateView.as_view(), name='update')
🧠 CBV별 URL 파라미터 이름 규칙
CBV 종류 기대하는 URL 변수 커스터마이징 가능 여부 예시
ListView | 없음 | ✅ 자유롭게 가능 | blog_pk, slug 등 |
CreateView | 없음 | ✅ 자유롭게 가능 | 객체 없으므로 영향 없음 |
DetailView | pk | ❌ 내부 get_object에서 고정 | <int:pk>/ 필요 |
UpdateView | pk | ❌ 내부 get_object에서 고정 | <int:pk>/update/ 필요 |
DeleteView | pk | ❌ 내부 get_object에서 고정 | <int:pk>/delete/ 필요 |
✅ 실제 구성 예시 정리
# 정상 동작 구성
path('<int:blog_pk>/', BlogDetailView.as_view(), name='detail') # ✅ 자유롭게 blog_pk 사용
path('<int:pk>/update/', BlogUpdateView.as_view(), name='update') # ✅ pk로 고정해야 함
path('cb/<int:pk>/delete/', BlogDeleteView.as_view(), name='delete') # ✅ pk로 고정해야 함
🔚 마무리 정리
- ListView, CreateView 등은 URL 파라미터 이름을 자유롭게 써도 되지만,
- UpdateView, DeleteView, DetailView는 반드시 pk라는 이름을 사용해야 Django의 내부 동작과 맞습니다.
- reverse()나 get_absolute_url()을 쓸 때도 URLConf에서 사용한 이름(pk 또는 blog_pk)과 정확히 일치시켜야 오류가 나지 않습니다.
🎯 URLConf와 kwargs 키는 반드시 1:1로 맞춰야 Django가 정상적으로 URL을 찾을 수 있습니다.