📌 Django 템플릿에서 FBV / CBV 네임스페이스에 따라 분기 처리하는 방법

2025. 5. 8. 18:26·기술블로그-Django편

📌 Django 템플릿에서 FBV / CBV 네임스페이스에 따라 분기 처리하는 방법

Django에서는 함수 기반 뷰(FBV)와 클래스 기반 뷰(CBV)를 혼용해 사용할 수 있습니다. 하지만 템플릿에서 URL 네임스페이스를 구분하지 않으면 원하지 않는 뷰가 호출되는 문제가 발생할 수 있습니다.


❗️ 문제 상황 요약

✅ 실수 포인트

  • 템플릿에서 {% url 'blog:update' blog.pk %} 형태로 URL을 하드코딩
  • FBV용 URLConf를 사용하는데, CBV용 템플릿을 그대로 사용
  • 결과적으로 FBV 뷰가 호출되지만 URL은 CBV 네임스페이스를 가리킴

🔍 이로 인해 reverse('blog:update')가 실행되며 의도한 URL과 다른 뷰로 이동하게 됨


✅ 해결 방법: 네임스페이스 분기 처리

✔️ 핵심 개념: request.resolver_match.namespace

  • 현재 요청된 URL의 네임스페이스(fb 또는 blog)를 확인 가능
  • 이를 기반으로 템플릿 내에서 URL 호출을 분기 처리할 수 있음

🧩 blog_detail.html 수정 예시

{% if request.resolver_match.namespace == 'fb' %}
  <a href="{% url 'fb:update' blog.pk %}">수정</a>
  <form action="{% url 'fb:delete' blog.pk %}" method="POST">
{% else %}
  <a href="{% url 'blog:update' blog.pk %}">수정</a>
  <form action="{% url 'blog:delete' blog.pk %}" method="POST">
{% endif %}
    {% csrf_token %}
    <button type="submit">삭제</button>
  </form>

{% if request.resolver_match.namespace == 'fb' %}
  <a href="{% url 'fb:list' %}">목록으로 돌아가기</a>
{% else %}
  <a href="{% url 'blog:list' %}">목록으로 돌아가기</a>
{% endif %}

📌 이처럼 템플릿 내에서 if 문을 활용해 네임스페이스에 따라 적절한 URL로 연결되도록 조정합니다.


🧩 base.html 수정 예시

<div>
  {% if request.resolver_match.namespace == 'fb' %}
    <a href="{% url 'fb:list' %}">홈</a>
  {% else %}
    <a href="{% url 'blog:list' %}">홈</a>
  {% endif %}
</div>

📌 공통 레이아웃에서도 동일하게 처리해야 헤더/네비게이션 영역에서 링크 오류가 발생하지 않습니다.


📊 정리 요약

항목 설명

네임스페이스 app_name = 'fb', app_name = 'blog' 로 URLConf에 정의된 구분자
문제 원인 템플릿은 하나인데 URL 네임스페이스가 달라 잘못된 뷰로 이동
해결 방법 request.resolver_match.namespace를 활용한 템플릿 내 분기 처리

💡 추천 전략 및 팁

✅ 전략 1: 템플릿 분리

  • blog/fbv_detail.html vs blog/cbv_detail.html 식으로 나누어 관리

✅ 전략 2: 네임스페이스 조건 분기

  • 하나의 템플릿을 공유하면서도 namespace를 기준으로 유연하게 처리 가능

🚫 흔한 실수: URL 하드코딩 후 복붙 사용 → 의도와 다른 네임스페이스로 이동

✔️ 예방 팁:

  • 항상 템플릿이 어떤 URLConf와 연결되는지 체크
  • 네임스페이스 기반 URL 사용 시 reverse() 오류 유의

앞으로 템플릿을 재사용할 땐, namespace 기반 URL 분기 처리를 습관화하세요.
의도하지 않은 뷰 호출 문제를 효과적으로 예방할 수 있습니다.

'기술블로그-Django편' 카테고리의 다른 글

📌 Django에서 누락된 category 필드 일괄 업데이트하기 (default 적용)  (0) 2025.05.08
📌 Django 템플릿과 View에서 권한 분기 처리 완전 정복  (0) 2025.05.08
📌 Django에서 reverse와 reverse_lazy 차이 완전 정복  (0) 2025.05.08
📌 Python에서 :와 =는 어떻게 다를까? – 명확한 규칙과 사용법 정리  (0) 2025.05.08
📌 Python 오버라이딩(Overriding) 완전 정복 - 개념, 예시, Django 실전 활용까지  (0) 2025.05.08
'기술블로그-Django편' 카테고리의 다른 글
  • 📌 Django에서 누락된 category 필드 일괄 업데이트하기 (default 적용)
  • 📌 Django 템플릿과 View에서 권한 분기 처리 완전 정복
  • 📌 Django에서 reverse와 reverse_lazy 차이 완전 정복
  • 📌 Python에서 :와 =는 어떻게 다를까? – 명확한 규칙과 사용법 정리
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (800) N
      • Python (32)
      • 프로젝트 (115) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (154)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    lawsuitculture
    americanlaw
    bts
    college reunions
    urbantrends
    basalcellcarcinoma
    trumpmuskclash
    btsdischarge
    titaniumcase
    btsreunion
    travel ban
    life reflection
    chatgpterror
    self-growth
    remittance
    hotcoffeecase
    classaction
    RM
    chinanightlife
    livebroadcast
    homebartrend
    youngprofessionals
    btscomeback
    뷔
    btsjungkook
    americaparty
    global politics
    gpterror
    newpoliticalparty
    smartphonedurability
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
📌 Django 템플릿에서 FBV / CBV 네임스페이스에 따라 분기 처리하는 방법
상단으로

티스토리툴바