기술블로그-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을 찾을 수 있습니다.